Random fixes and improvements for visual debug traces

This commit is contained in:
pancake 2019-03-24 01:58:29 +01:00
parent 82d1e96b7a
commit 41c7ba5cd2
2 changed files with 50 additions and 11 deletions

View File

@ -4224,7 +4224,7 @@ static char *get_corefile_name (const char *raw_name, int pid) {
} }
static int cmd_debug_step (RCore *core, const char *input) { static int cmd_debug_step (RCore *core, const char *input) {
ut64 addr; ut64 addr = core->offset;;
ut8 buf[64]; ut8 buf[64];
RAnalOp aop; RAnalOp aop;
int i, times = 1; int i, times = 1;
@ -4243,7 +4243,7 @@ static int cmd_debug_step (RCore *core, const char *input) {
// XXX(jjd): is this necessary? // XXX(jjd): is this necessary?
r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, false); r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, false);
ut64 pc = r_debug_reg_get (core->dbg, "PC"); ut64 pc = r_debug_reg_get (core->dbg, "PC");
r_debug_trace_pc (core->dbg, addr); r_debug_trace_pc (core->dbg, pc);
if (!r_debug_step (core->dbg, times)) { if (!r_debug_step (core->dbg, times)) {
eprintf ("Step failed\n"); eprintf ("Step failed\n");
core->break_loop = true; core->break_loop = true;
@ -4470,8 +4470,21 @@ static int cmd_debug(void *data, const char *input) {
} }
break; break;
case 'd': // "dtd" case 'd': // "dtd"
if (input[2] == ' ') { if (input[2] == 'q') {
int min = r_num_math (core->num, input + 2); int min = r_num_math (core->num, input + 3);
RListIter *iter;
RDebugTracepoint *trace;
int n = 0;
r_list_foreach (core->dbg->trace->traces, iter, trace) {
// if (trace->count >= min) {
if (n >= min) {
r_cons_printf ("0x%08"PFMT64x"\n", trace->addr);
break;
}
n++;
}
} else{ if (input[2] == ' ') {
int min = r_num_math (core->num, input + 3);
RListIter *iter; RListIter *iter;
RDebugTracepoint *trace; RDebugTracepoint *trace;
int n = 0; int n = 0;
@ -4486,6 +4499,7 @@ static int cmd_debug(void *data, const char *input) {
// TODO: reimplement using the api // TODO: reimplement using the api
r_core_cmd0 (core, "pd 1 @@= `dtq`"); r_core_cmd0 (core, "pd 1 @@= `dtq`");
} }
}
break; break;
case 'g': // "dtg" case 'g': // "dtg"
dot_trace_traverse (core, core->dbg->tree, input[2]); dot_trace_traverse (core, core->dbg->tree, input[2]);

View File

@ -2771,17 +2771,32 @@ static void r_core_visual_anal_refresh_oneshot (RCore *core) {
r_core_task_enqueue_oneshot (core, (RCoreTaskOneShot) r_core_visual_anal_refresh, core); r_core_task_enqueue_oneshot (core, (RCoreTaskOneShot) r_core_visual_anal_refresh, core);
} }
static void r_core_visual_debugtraces_help(RCore *core) {
r_cons_clear00 ();
r_cons_printf (
"vbd: Visual Browse Debugtraces:\n\n"
" q - quit the bit editor\n"
" Q - Quit (jump into the disasm view)\n"
" j/k - Select next/previous trace\n"
" : - enter command\n");
r_cons_flush ();
r_cons_any_key (NULL);
}
R_API void r_core_visual_debugtraces(RCore *core, const char *input) { R_API void r_core_visual_debugtraces(RCore *core, const char *input) {
int i, delta = 0; int i, delta = 0;
for (;;) { for (;;) {
r_cons_printf ("[0x%08x]> dbg.trace\n", delta); char *trace_addr_str = r_core_cmd_strf (core, "dtdq %d", delta);
ut64 trace_addr = r_num_get (NULL, trace_addr_str);
free (trace_addr_str);
r_cons_printf ("[0x%08"PFMT64x"]> %d dbg.trace\n", trace_addr, delta);
for (i = 0; i < delta; i++) { for (i = 0; i < delta; i++) {
r_core_cmdf (core, ".dte %d", i); r_core_cmdf (core, ".dte %d", i);
} }
r_core_cmd0 (core, "x 64@rsp"); r_core_cmd0 (core, "x 64@r:SP");
r_core_cmd0 (core, "dri"); r_core_cmd0 (core, "dri");
// limit by rows here // limit by rows here
int rows = r_cons_get_size (NULL); //int rows = r_cons_get_size (NULL);
r_core_cmdf (core, "dtd %d", delta); r_core_cmdf (core, "dtd %d", delta);
r_cons_visual_flush (); r_cons_visual_flush ();
char ch ; char ch ;
@ -2800,16 +2815,23 @@ R_API void r_core_visual_debugtraces(RCore *core, const char *input) {
} }
ch = r_cons_arrow_to_hjkl (ch); // get ESC+char, return 'hjkl' char ch = r_cons_arrow_to_hjkl (ch); // get ESC+char, return 'hjkl' char
switch (ch) { switch (ch) {
case 'Q': // tab
{
ut64 oseek = core->offset;
core->vmode = false;
r_core_seek (core, trace_addr, true);
r_core_visual (core, "");
r_core_seek (core, oseek, true);
}
break;
case 'q': case 'q':
goto beach; goto beach;
break; break;
case '?':
break;
case ']': case ']':
r_config_set (core->config, "hex.cols", r_config_get_i (core->config, "hex.cols") + 1); r_config_set_i (core->config, "hex.cols", r_config_get_i (core->config, "hex.cols") + 1);
break; break;
case '[': case '[':
r_config_set (core->config, "hex.cols", r_config_get_i (core->config, "hex.cols") - 1); r_config_set_i (core->config, "hex.cols", r_config_get_i (core->config, "hex.cols") - 1);
break; break;
case 'J': case 'J':
delta += 10; delta += 10;
@ -2832,6 +2854,9 @@ R_API void r_core_visual_debugtraces(RCore *core, const char *input) {
r_core_visual_prompt (core); r_core_visual_prompt (core);
r_cons_any_key (NULL); r_cons_any_key (NULL);
break; break;
case '?':
r_core_visual_debugtraces_help (core);
break;
} }
} }
beach: beach: