Refactor to use API in visual mode
This commit is contained in:
parent
027b2c27dc
commit
fcb110080e
6 changed files with 72 additions and 80 deletions
|
|
@ -3522,7 +3522,7 @@ static int agraph_refresh(struct agraph_refresh_data *grd) {
|
|||
RzAnalysisBlock *block = rz_analysis_find_most_relevant_block_in(core->analysis, addr);
|
||||
char *title = get_title(block ? block->addr : addr);
|
||||
if (!acur || strcmp(acur->title, title)) {
|
||||
rz_core_cmd0(core, "sr PC");
|
||||
rz_core_seek_to_register(core, "PC", false);
|
||||
}
|
||||
free(title);
|
||||
g->is_instep = false;
|
||||
|
|
@ -3977,41 +3977,20 @@ static void seek_to_node(RzANode *n, RzCore *core) {
|
|||
}
|
||||
|
||||
static void graph_single_step_in(RzCore *core, RzAGraph *g) {
|
||||
if (rz_config_get_i(core->config, "cfg.debug")) {
|
||||
if (core->print->cur_enabled) {
|
||||
rz_core_debug_continue_until(core, core->offset, core->offset + core->print->cur);
|
||||
core->print->cur_enabled = 0;
|
||||
} else {
|
||||
rz_core_debug_step_one(core, 1);
|
||||
rz_core_debug_regs2flags(core, 0);
|
||||
}
|
||||
} else {
|
||||
rz_core_cmd(core, "aes", 0);
|
||||
rz_core_regs2flags(core);
|
||||
}
|
||||
rz_core_debug_single_step_in(core);
|
||||
g->is_instep = true;
|
||||
g->need_reload_nodes = true;
|
||||
}
|
||||
|
||||
static void graph_single_step_over(RzCore *core, RzAGraph *g) {
|
||||
if (rz_config_get_i(core->config, "cfg.debug")) {
|
||||
if (core->print->cur_enabled) {
|
||||
rz_core_cmd(core, "dcr", 0);
|
||||
core->print->cur_enabled = 0;
|
||||
} else {
|
||||
rz_core_cmd(core, "dso", 0);
|
||||
rz_core_debug_regs2flags(core, 0);
|
||||
}
|
||||
} else {
|
||||
rz_core_cmd(core, "aeso", 0);
|
||||
rz_core_regs2flags(core);
|
||||
}
|
||||
rz_core_debug_single_step_over(core);
|
||||
g->is_instep = true;
|
||||
g->need_reload_nodes = true;
|
||||
}
|
||||
|
||||
static void graph_breakpoint(RzCore *core) {
|
||||
rz_core_cmd(core, "dbs $$", 0);
|
||||
ut64 addr = core->print->cur_enabled ? core->offset + core->print->cur : core->offset;
|
||||
rz_core_debug_breakpoint_toggle(core, addr);
|
||||
}
|
||||
|
||||
static void graph_continue(RzCore *core) {
|
||||
|
|
@ -4514,8 +4493,12 @@ RZ_API int rz_core_visual_graph(RzCore *core, RzAGraph *g, RzAnalysisFunction *_
|
|||
rz_core_visual_toggle_hints(core);
|
||||
break;
|
||||
case '$':
|
||||
rz_core_cmd(core, "dr PC=$$", 0);
|
||||
rz_core_cmd(core, "sr PC", 0);
|
||||
if (core->print->cur_enabled) {
|
||||
rz_core_debug_reg_set(core, "PC", core->offset + core->print->cur, NULL);
|
||||
} else {
|
||||
rz_core_debug_reg_set(core, "PC", core->offset, NULL);
|
||||
}
|
||||
rz_core_seek_to_register(core, "PC", false);
|
||||
g->need_reload_nodes = true;
|
||||
break;
|
||||
case 'R':
|
||||
|
|
@ -4545,7 +4528,7 @@ RZ_API int rz_core_visual_graph(RzCore *core, RzAGraph *g, RzAnalysisFunction *_
|
|||
char buf[256];
|
||||
rz_line_set_prompt("[comment]> ");
|
||||
if (rz_cons_fgets(buf, sizeof(buf), 0, NULL) > 0) {
|
||||
rz_core_cmdf(core, "\"CC %s\"", buf);
|
||||
rz_meta_set_string(core->analysis, RZ_META_TYPE_COMMENT, core->offset, buf);
|
||||
}
|
||||
g->need_reload_nodes = true;
|
||||
showcursor(core, false);
|
||||
|
|
|
|||
|
|
@ -522,6 +522,39 @@ RZ_API void rz_core_debug_ri(RzCore *core, RzReg *reg, int mode) {
|
|||
ht_up_free(db);
|
||||
}
|
||||
|
||||
RZ_IPI void rz_core_debug_single_step_in(RzCore *core) {
|
||||
if (rz_config_get_b(core->config, "cfg.debug")) {
|
||||
if (core->print->cur_enabled) {
|
||||
rz_core_debug_continue_until(core, core->offset, core->offset + core->print->cur);
|
||||
core->print->cur_enabled = 0;
|
||||
} else {
|
||||
rz_core_debug_step_one(core, 1);
|
||||
rz_core_debug_regs2flags(core, 0);
|
||||
}
|
||||
} else {
|
||||
rz_core_esil_step(core, UT64_MAX, NULL, NULL, false);
|
||||
rz_core_regs2flags(core);
|
||||
}
|
||||
}
|
||||
|
||||
RZ_IPI void rz_core_debug_single_step_over(RzCore *core) {
|
||||
bool io_cache = rz_config_get_b(core->config, "io.cache");
|
||||
rz_config_set_b(core->config, "io.cache", false);
|
||||
if (rz_config_get_b(core->config, "cfg.debug")) {
|
||||
if (core->print->cur_enabled) {
|
||||
rz_core_cmd(core, "dcr", 0);
|
||||
core->print->cur_enabled = 0;
|
||||
} else {
|
||||
rz_core_cmd(core, "dso", 0);
|
||||
rz_core_debug_regs2flags(core, 0);
|
||||
}
|
||||
} else {
|
||||
rz_core_cmd(core, "aeso", 0);
|
||||
rz_core_regs2flags(core);
|
||||
}
|
||||
rz_config_set_b(core->config, "io.cache", io_cache);
|
||||
}
|
||||
|
||||
RZ_IPI void rz_core_debug_breakpoint_toggle(RzCore *core, ut64 addr) {
|
||||
RzBreakpointItem *bpi = rz_bp_get_at(core->dbg->bp, addr);
|
||||
if (bpi) {
|
||||
|
|
|
|||
|
|
@ -62,15 +62,15 @@ static void printPadded(RzCore *core, int pad) {
|
|||
free(fmt);
|
||||
}
|
||||
|
||||
static bool seek_to_register(RzCore *core, const char *input, bool is_silent) {
|
||||
RZ_IPI bool rz_core_seek_to_register(RzCore *core, const char *regname, bool is_silent) {
|
||||
ut64 off;
|
||||
if (core->bin->is_debugger) {
|
||||
off = rz_debug_reg_get(core->dbg, input);
|
||||
off = rz_debug_reg_get(core->dbg, regname);
|
||||
return rz_core_seek_opt(core, off, true, !is_silent);
|
||||
} else {
|
||||
RzReg *orig = core->dbg->reg;
|
||||
core->dbg->reg = core->analysis->reg;
|
||||
off = rz_debug_reg_get(core->dbg, input);
|
||||
off = rz_debug_reg_get(core->dbg, regname);
|
||||
core->dbg->reg = orig;
|
||||
return rz_core_seek_opt(core, off, true, !is_silent);
|
||||
}
|
||||
|
|
@ -271,7 +271,7 @@ RZ_IPI int rz_cmd_seek(void *data, const char *input) {
|
|||
switch (*input) {
|
||||
case 'r': // "sr"
|
||||
if (input[1] && input[2]) {
|
||||
seek_to_register(core, input + 2, silent);
|
||||
rz_core_seek_to_register(core, input + 2, silent);
|
||||
} else {
|
||||
eprintf("|Usage| 'sr PC' seek to program counter register\n");
|
||||
}
|
||||
|
|
@ -772,5 +772,5 @@ RZ_IPI RzCmdStatus rz_seek_opcode_handler(RzCore *core, int argc, const char **a
|
|||
}
|
||||
|
||||
RZ_IPI RzCmdStatus rz_seek_register_handler(RzCore *core, int argc, const char **argv) {
|
||||
return bool2cmdstatus(seek_to_register(core, argv[1], false));
|
||||
}
|
||||
return bool2cmdstatus(rz_core_seek_to_register(core, argv[1], false));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,9 +13,15 @@ RZ_IPI bool rz_core_debug_reg_set(RzCore *core, const char *regname, ut64 val, c
|
|||
RZ_IPI bool rz_core_debug_reg_list(RzCore *core, int type, int size, PJ *pj, int rad, const char *use_color);
|
||||
RZ_IPI void rz_core_debug_regs2flags(RzCore *core, int bits);
|
||||
RZ_IPI void rz_core_regs2flags(RzCore *core);
|
||||
RZ_IPI void rz_core_debug_single_step_in(RzCore *core);
|
||||
RZ_IPI void rz_core_debug_single_step_over(RzCore *core);
|
||||
RZ_IPI void rz_core_debug_breakpoint_toggle(RzCore *core, ut64 addr);
|
||||
RZ_IPI void rz_core_debug_continue(RzCore *core);
|
||||
|
||||
/* cmd_eval.c */
|
||||
RZ_IPI bool rz_core_load_theme(RzCore *core, const char *name);
|
||||
|
||||
/* cmd_seek.c */
|
||||
|
||||
RZ_IPI bool rz_core_seek_to_register(RzCore *core, const char *input, bool is_silent);
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -5485,7 +5485,7 @@ void __set_breakpoints_on_cursor(RzCore *core, RzPanel *panel) {
|
|||
return;
|
||||
}
|
||||
if (__check_panel_type(panel, PANEL_CMD_DISASSEMBLY)) {
|
||||
rz_core_cmdf(core, "dbs 0x%08" PFMT64x, core->offset + core->print->cur);
|
||||
rz_core_debug_breakpoint_toggle(core, core->offset + core->print->cur);
|
||||
panel->view->refresh = true;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -776,39 +776,6 @@ RZ_API int rz_core_visual_prompt(RzCore *core) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
static void visual_single_step_in(RzCore *core) {
|
||||
if (rz_config_get_b(core->config, "cfg.debug")) {
|
||||
if (core->print->cur_enabled) {
|
||||
rz_core_debug_continue_until(core, core->offset, core->offset + core->print->cur);
|
||||
core->print->cur_enabled = 0;
|
||||
} else {
|
||||
rz_core_debug_step_one(core, 1);
|
||||
rz_core_debug_regs2flags(core, 0);
|
||||
}
|
||||
} else {
|
||||
rz_core_esil_step(core, UT64_MAX, NULL, NULL, false);
|
||||
rz_core_regs2flags(core);
|
||||
}
|
||||
}
|
||||
|
||||
static void __core_visual_step_over(RzCore *core) {
|
||||
bool io_cache = rz_config_get_b(core->config, "io.cache");
|
||||
rz_config_set_b(core->config, "io.cache", false);
|
||||
if (rz_config_get_b(core->config, "cfg.debug")) {
|
||||
if (core->print->cur_enabled) {
|
||||
rz_core_cmd(core, "dcr", 0);
|
||||
core->print->cur_enabled = 0;
|
||||
} else {
|
||||
rz_core_cmd(core, "dso", 0);
|
||||
rz_core_debug_regs2flags(core, 0);
|
||||
}
|
||||
} else {
|
||||
rz_core_cmd(core, "aeso", 0);
|
||||
rz_core_regs2flags(core);
|
||||
}
|
||||
rz_config_set_b(core->config, "io.cache", io_cache);
|
||||
}
|
||||
|
||||
static void visual_breakpoint(RzCore *core) {
|
||||
rz_core_debug_breakpoint_toggle(core, core->offset);
|
||||
}
|
||||
|
|
@ -872,7 +839,7 @@ static int visual_nkey(RzCore *core, int ch) {
|
|||
if (cmd && *cmd) {
|
||||
ch = rz_core_cmd0(core, cmd);
|
||||
} else {
|
||||
visual_single_step_in(core);
|
||||
rz_core_debug_single_step_in(core);
|
||||
}
|
||||
break;
|
||||
case RZ_CONS_KEY_F8:
|
||||
|
|
@ -880,7 +847,7 @@ static int visual_nkey(RzCore *core, int ch) {
|
|||
if (cmd && *cmd) {
|
||||
ch = rz_core_cmd0(core, cmd);
|
||||
} else {
|
||||
__core_visual_step_over(core);
|
||||
rz_core_debug_single_step_over(core);
|
||||
}
|
||||
break;
|
||||
case RZ_CONS_KEY_F9:
|
||||
|
|
@ -1437,13 +1404,16 @@ repeat:
|
|||
} else {
|
||||
name[0] = 0;
|
||||
}
|
||||
char *cmt = rz_core_cmd_strf(core, "CC.@0x%08" PFMT64x, refi->addr);
|
||||
rz_str_trim(cmt);
|
||||
rz_cons_printf(" %d [%s] 0x%08" PFMT64x " 0x%08" PFMT64x " %s %sref (%s) ; %s\n",
|
||||
idx, cstr, refi->at, refi->addr,
|
||||
rz_analysis_xrefs_type_tostring(refi->type),
|
||||
xref ? "x" : "", name, cmt);
|
||||
free(cmt);
|
||||
|
||||
char *cmt = (char *)rz_meta_get_string(core->analysis, RZ_META_TYPE_COMMENT, refi->addr);
|
||||
if (cmt) {
|
||||
rz_str_trim(cmt);
|
||||
rz_cons_printf(" %d [%s] 0x%08" PFMT64x " 0x%08" PFMT64x " %s %sref (%s) ; %s\n",
|
||||
idx, cstr, refi->at, refi->addr,
|
||||
rz_analysis_xrefs_type_tostring(refi->type),
|
||||
xref ? "x" : "", name, cmt);
|
||||
free(cmt);
|
||||
}
|
||||
free(name);
|
||||
if (idx == skip) {
|
||||
free(dis);
|
||||
|
|
@ -2998,7 +2968,7 @@ RZ_API int rz_core_visual_cmd(RzCore *core, const char *arg) {
|
|||
if (key_s && *key_s) {
|
||||
rz_core_cmd0(core, key_s);
|
||||
} else {
|
||||
visual_single_step_in(core);
|
||||
rz_core_debug_single_step_in(core);
|
||||
}
|
||||
break;
|
||||
case 'S':
|
||||
|
|
@ -3006,7 +2976,7 @@ RZ_API int rz_core_visual_cmd(RzCore *core, const char *arg) {
|
|||
if (key_s && *key_s) {
|
||||
rz_core_cmd0(core, key_s);
|
||||
} else {
|
||||
__core_visual_step_over(core);
|
||||
rz_core_debug_single_step_over(core);
|
||||
}
|
||||
break;
|
||||
case '"':
|
||||
|
|
|
|||
Loading…
Reference in a new issue