Refactor to use API in visual mode

This commit is contained in:
Anton Kochkov 2021-02-10 22:29:07 +08:00 committed by Anton Kochkov
parent 027b2c27dc
commit fcb110080e
6 changed files with 72 additions and 80 deletions

View file

@ -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);

View file

@ -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) {

View file

@ -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));
}

View file

@ -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

View file

@ -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;
}
}

View file

@ -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 '"':