From a9d957ee25917dbc7a4d341c6c6137bad28fd3ac Mon Sep 17 00:00:00 2001 From: fcasal Date: Thu, 28 Jun 2018 14:54:48 +0100 Subject: [PATCH] Added json version of register telescoping (#10530) --- libr/core/cmd_anal.c | 10 ++++++++- libr/core/cmd_debug.c | 52 ++++++++++++++++++++++++++++++++++--------- libr/include/r_core.h | 2 +- 3 files changed, 51 insertions(+), 13 deletions(-) diff --git a/libr/core/cmd_anal.c b/libr/core/cmd_anal.c index f7dedc7edbd50..0ca32cc8f3972 100644 --- a/libr/core/cmd_anal.c +++ b/libr/core/cmd_anal.c @@ -495,6 +495,7 @@ static const char *help_msg_ar[] = { "ar", " ", "Show all registers of given type", "arC", "", "Display register profile comments", "arr", "", "Show register references (telescoping)", + "arrj", "", "Show register references (telescoping) in JSON format", "ar=", "([size])(:[regs])", "Show register values in columns", "ar?", " ", "Show register value", "arb", " ", "Display hexdump of the given arena", @@ -2941,7 +2942,14 @@ void cmd_anal_reg(RCore *core, const char *str) { } break; case 'r': // "arr" - r_core_debug_rr (core, core->anal->reg); + switch (str[1]) { + case 'j': // "arrj" + r_core_debug_rr (core, core->dbg->reg, 'j'); + break; + default: + r_core_debug_rr (core, core->dbg->reg, 0); + break; + } break; case 'S': { // "arS" int sz; diff --git a/libr/core/cmd_debug.c b/libr/core/cmd_debug.c index ae50bb8434634..31810f7a77ca0 100644 --- a/libr/core/cmd_debug.c +++ b/libr/core/cmd_debug.c @@ -322,6 +322,7 @@ static const char *help_msg_dr[] = { "drps", "", "Fake register profile size", "drpj", "", "Show the current register profile (JSON)", "drr", "", "Show registers references (telescoping)", + "drrj", "", "Show registers references (telescoping) in JSON format", // TODO: 'drs' to swap register arenas and display old register valuez "drs", "[?]", "Stack register states", "drt", " 16", "Show 16 bit registers", @@ -1872,7 +1873,7 @@ static int cmd_debug_map(RCore *core, const char *input) { #include "linux_heap_glibc.c" #endif -R_API void r_core_debug_rr(RCore *core, RReg *reg) { +R_API void r_core_debug_rr(RCore *core, RReg *reg, int mode) { char *use_color, *color = ""; int use_colors = r_config_get_i (core->config, "scr.color"); int delta = 0; @@ -1889,6 +1890,9 @@ R_API void r_core_debug_rr(RCore *core, RReg *reg) { use_color = NULL; } r_debug_map_sync (core->dbg); + if (mode == 'j') { + r_cons_printf("["); + } r_list_foreach (list, iter, r) { char *rrstr, *tmp = NULL; if (r->size != bits) { @@ -1909,29 +1913,48 @@ R_API void r_core_debug_rr(RCore *core, RReg *reg) { } else { color = ""; } - if (bits == 64) { + switch (mode) { + case 'j': if (r->flags) { tmp = r_reg_get_bvalue (reg, r); - r_cons_printf ("%s%6s %018s%s", color, r->name, tmp, Color_RESET); + r_cons_printf ("%s{\"reg\":\"%s\",\"value\":\"%s\"", iter->p?",":"", r->name, tmp); } else { - r_cons_printf ("%s%6s 0x%016"PFMT64x"%s", color, r->name, value, Color_RESET); + r_cons_printf ("%s{\"reg\":\"%s\",\"value\":\"0x%"PFMT64x"\"", iter->p?",":"", r->name, value); } - } else { - if (r->flags) { - tmp = r_reg_get_bvalue (reg, r); - r_cons_printf ("%6s %010s", r->name, tmp); + break; + default: + if (bits == 64) { + if (r->flags) { + tmp = r_reg_get_bvalue (reg, r); + r_cons_printf ("%s%6s %-18s%s", color, r->name, tmp, Color_RESET); + } else { + r_cons_printf ("%s%6s 0x%-16"PFMT64x"%s", color, r->name, value, Color_RESET); + } } else { - r_cons_printf ("%6s 0x%08"PFMT64x, r->name, value); + if (r->flags) { + tmp = r_reg_get_bvalue (reg, r); + r_cons_printf ("%s%6s %-10s%s", color, r->name, tmp, Color_RESET); + } else { + r_cons_printf ("%s%6s 0x%-8"PFMT64x"%s", color, r->name, value, Color_RESET); + } } + break; } if (r->flags) { free (tmp); } if (rrstr) { - r_cons_printf (" %s\n", rrstr); + if (mode == 'j') { + r_cons_printf (",\"ref\":\"%s\"}", rrstr); + } else { + r_cons_printf (" %s\n", rrstr); + } free (rrstr); } } + if (mode == 'j') { + r_cons_printf("]\n"); + } } static void show_drpi(RCore *core) { @@ -2555,7 +2578,14 @@ static void cmd_debug_reg(RCore *core, const char *str) { } break; case 'r': // "drr" - r_core_debug_rr (core, core->dbg->reg); + switch (str[1]) { + case 'j': // "drrj" + r_core_debug_rr (core, core->dbg->reg, 'j'); + break; + default: + r_core_debug_rr (core, core->dbg->reg, 0); + break; + } break; case 'j': // "drj" case '\0': // "dr" diff --git a/libr/include/r_core.h b/libr/include/r_core.h index 4ff7b9179d851..7c0aab0f49609 100644 --- a/libr/include/r_core.h +++ b/libr/include/r_core.h @@ -388,7 +388,7 @@ R_API int r_core_set_file_by_name (RBin * bin, const char * name); R_API RBinFile * r_core_bin_cur (RCore *core); R_API ut32 r_core_file_cur_fd (RCore *core); -R_API void r_core_debug_rr (RCore *core, RReg *reg); +R_API void r_core_debug_rr (RCore *core, RReg *reg, int mode); /* fortune */ R_API void r_core_fortune_list_types(void);