diff --git a/librz/core/cdebug.c b/librz/core/cdebug.c index deb6075fa9..d619e9072e 100644 --- a/librz/core/cdebug.c +++ b/librz/core/cdebug.c @@ -3,6 +3,7 @@ #include #include #include "core_private.h" +#include "cmd_descs.h" static bool is_x86_call(RzDebug *dbg, ut64 addr) { ut8 buf[3]; @@ -66,6 +67,15 @@ RZ_API bool rz_core_debug_step_one(RzCore *core, int times) { return true; } +RZ_IPI void rz_core_debug_continue(RzCore *core) { + if (rz_config_get_b(core->config, "cfg.debug")) { + rz_debug_continue_oldhandler(core, ""); + } else { + rz_core_esil_step(core, UT64_MAX, "0", NULL, false); + rz_core_regs2flags(core); + } +} + RZ_API bool rz_core_debug_continue_until(RzCore *core, ut64 addr, ut64 to) { ut64 pc; if (!strcmp(core->dbg->btalgo, "trace") && core->dbg->arch && !strcmp(core->dbg->arch, "x86") && core->dbg->bits == 4) { @@ -511,3 +521,17 @@ RZ_API void rz_core_debug_ri(RzCore *core, RzReg *reg, int mode) { rz_list_free(sorted); ht_up_free(db); } + +RZ_IPI void rz_core_debug_breakpoint_toggle(RzCore *core, ut64 addr) { + RzBreakpointItem *bpi = rz_bp_get_at(core->dbg->bp, addr); + if (bpi) { + rz_bp_del(core->dbg->bp, addr); + } else { + int hwbp = rz_config_get_i(core->config, "dbg.hwbp"); + bpi = rz_debug_bp_add(core->dbg, addr, hwbp, false, 0, NULL, 0); + if (!bpi) { + eprintf("Cannot set breakpoint at 0x%" PFMT64x "\n", addr); + } + } + rz_bp_enable(core->dbg->bp, addr, true, 0); +} diff --git a/librz/core/cmd_debug.c b/librz/core/cmd_debug.c index bf2d5537eb..df853f5dbb 100644 --- a/librz/core/cmd_debug.c +++ b/librz/core/cmd_debug.c @@ -3528,19 +3528,7 @@ static void rz_core_cmd_bp(RzCore *core, const char *input) { break; case 's': // "dbs" addr = rz_num_math(core->num, input + 2); - bpi = rz_bp_get_at(core->dbg->bp, addr); - if (bpi) { - //bp->enabled = !bp->enabled; - // XXX(jjd): this ^^ is what I would think toggling means... - rz_bp_del(core->dbg->bp, addr); - } else { - // XXX(jjd): does t his need an address validity check?? - bpi = rz_debug_bp_add(core->dbg, addr, hwbp, false, 0, NULL, 0); - if (!bpi) { - eprintf("Cannot set breakpoint (%s)\n", input + 2); - } - } - rz_bp_enable(core->dbg->bp, rz_num_math(core->num, input + 2), true, 0); + rz_core_debug_breakpoint_toggle(core, addr); break; case 'n': // "dbn" bpi = rz_bp_get_at(core->dbg->bp, core->offset); diff --git a/librz/core/cmd_eval.c b/librz/core/cmd_eval.c index df4c07bed7..2f1e3cc012 100644 --- a/librz/core/cmd_eval.c +++ b/librz/core/cmd_eval.c @@ -137,35 +137,34 @@ static bool nextpal_item(RzCore *core, int mode, const char *file, int ctr) { return true; } -static bool cmd_load_theme(RzCore *core, const char *_arg) { +RZ_IPI bool rz_core_load_theme(RzCore *core, const char *name) { bool failed = false; char *path; - if (!_arg || !*_arg) { + if (!name || !*name) { return false; } - if (!rz_str_cmp(_arg, "default", strlen(_arg))) { - curtheme = strdup(_arg); + if (!rz_str_cmp(name, "default", strlen(name))) { + curtheme = strdup(name); rz_cons_pal_init(core->cons->context); return true; } - char *arg = strdup(_arg); - char *tmp = rz_str_newf(RZ_JOIN_2_PATHS(RZ_HOME_THEMES, "%s"), arg); + char *tmp = rz_str_newf(RZ_JOIN_2_PATHS(RZ_HOME_THEMES, "%s"), name); char *home = tmp ? rz_str_home(tmp) : NULL; free(tmp); - tmp = rz_str_newf(RZ_JOIN_2_PATHS(RZ_THEMES, "%s"), arg); + tmp = rz_str_newf(RZ_JOIN_2_PATHS(RZ_THEMES, "%s"), name); path = tmp ? rz_str_rz_prefix(tmp) : NULL; free(tmp); if (!load_theme(core, home)) { if (load_theme(core, path)) { - curtheme = rz_str_dup(curtheme, arg); + curtheme = rz_str_dup(curtheme, name); } else { - if (load_theme(core, arg)) { - curtheme = rz_str_dup(curtheme, arg); + if (load_theme(core, name)) { + curtheme = rz_str_dup(curtheme, name); } else { - char *absfile = rz_file_abspath(arg); + char *absfile = rz_file_abspath(name); eprintf("eco: cannot open colorscheme profile (%s)\n", absfile); free(absfile); failed = true; @@ -174,7 +173,6 @@ static bool cmd_load_theme(RzCore *core, const char *_arg) { } free(home); free(path); - free(arg); return !failed; } @@ -299,7 +297,7 @@ done: //rz_core_theme_nextpal (core, mode); } else if (mode == 'n' || mode == 'p') { if (curtheme) { - cmd_load_theme(core, curtheme); + rz_core_load_theme(core, curtheme); } } rz_list_free(files); @@ -339,9 +337,9 @@ RZ_IPI int rz_eval_color(void *data, const char *input) { if (input[1] == 'j') { rz_core_theme_nextpal(core, 'j'); } else if (input[1] == ' ') { - cmd_load_theme(core, input + 2); + rz_core_load_theme(core, input + 2); } else if (input[1] == 'o') { - cmd_load_theme(core, rz_core_get_theme()); + rz_core_load_theme(core, rz_core_get_theme()); } else if (input[1] == 'c' || input[1] == '.') { rz_cons_printf("%s\n", rz_core_get_theme()); } else if (input[1] == '?') { diff --git a/librz/core/core_private.h b/librz/core/core_private.h index 71cecc1e38..0efa728540 100644 --- a/librz/core/core_private.h +++ b/librz/core/core_private.h @@ -13,5 +13,9 @@ 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_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); #endif diff --git a/librz/core/panels.c b/librz/core/panels.c index 4a2bfec585..185fafa4cd 100644 --- a/librz/core/panels.c +++ b/librz/core/panels.c @@ -580,7 +580,6 @@ static void __esil_step_to(RzCore *core, ut64 end); static void __panel_breakpoint(RzCore *core); static void __panel_single_step_in(RzCore *core); static void __panel_single_step_over(RzCore *core); -static void __panel_continue(RzCore *core); /* zoom mode */ static void __save_panel_pos(RzPanel *panel); @@ -1646,8 +1645,7 @@ void __handleComment(RzCore *core) { addr = orig = core->offset; if (core->print->cur_enabled) { addr += core->print->cur; - rz_core_seek(core, addr, false); - rz_core_cmdf(core, "s 0x%" PFMT64x, addr); + rz_core_seek_and_save(core, addr, false); } if (!strcmp(buf + i, "-")) { strcpy(buf, "CC-"); @@ -1828,7 +1826,7 @@ bool __handle_cursor_mode(RzCore *core, const int key) { break; case '*': if (__check_panel_type(cur, PANEL_CMD_DISASSEMBLY)) { - rz_core_cmdf(core, "dr PC=0x%08" PFMT64x, core->offset + print->cur); + rz_core_debug_reg_set(core, "PC", core->offset + print->cur, NULL); __set_panel_addr(core, cur, core->offset + print->cur); } break; @@ -3216,7 +3214,7 @@ int __settings_colors_cb(void *user) { RzPanelsMenuItem *parent = menu->history[menu->depth - 1]; RzPanelsMenuItem *child = parent->sub[parent->selectedIndex]; rz_str_ansi_filter(child->name, NULL, NULL, -1); - rz_core_cmdf(core, "eco %s", child->name); + rz_core_load_theme(core, child->name); int i; for (i = 1; i < menu->depth; i++) { RzPanel *p = menu->history[i]->p; @@ -3514,7 +3512,7 @@ int __reload_cb(void *user) { int __function_cb(void *user) { RzCore *core = (RzCore *)user; - rz_core_cmdf(core, "af"); + rz_core_analysis_function_add(core, NULL, core->offset, false); return 0; } @@ -3556,7 +3554,7 @@ int __break_points_cb(void *user) { core->cons->line->prompt_type = RZ_LINE_PROMPT_DEFAULT; ut64 addr = rz_num_math(core->num, buf); - rz_core_cmdf(core, "dbs 0x%08" PFMT64x, addr); + rz_core_debug_breakpoint_toggle(core, addr); return 0; } @@ -4071,7 +4069,7 @@ void __esil_init(RzCore *core) { } void __esil_step_to(RzCore *core, ut64 end) { - rz_core_cmdf(core, "aesu 0x%08" PFMT64x, end); + rz_core_esil_step(core, end, NULL, NULL, false); } int __open_menu_cb(void *user) { @@ -4797,10 +4795,10 @@ void __do_panels_refreshOneShot(RzCore *core) { void __panel_single_step_in(RzCore *core) { if (rz_config_get_b(core->config, "cfg.debug")) { - rz_core_cmd(core, "ds", 0); + rz_core_debug_step_one(core, 1); rz_core_debug_regs2flags(core, 0); } else { - rz_core_cmd(core, "aes", 0); + rz_core_esil_step(core, UT64_MAX, NULL, NULL, false); rz_core_regs2flags(core); } } @@ -4821,15 +4819,11 @@ void __panel_single_step_over(RzCore *core) { void __panel_breakpoint(RzCore *core) { RzPanel *cur = __get_cur_panel(core->panels); if (__check_panel_type(cur, PANEL_CMD_DISASSEMBLY)) { - rz_core_cmd(core, "dbs $$", 0); + rz_core_debug_breakpoint_toggle(core, core->offset); cur->view->refresh = true; } } -void __panel_continue(RzCore *core) { - rz_debug_continue_oldhandler(core, ""); -} - void __panels_check_stackbase(RzCore *core) { if (!core || !core->panels) { return; @@ -5156,7 +5150,7 @@ void __handle_menu(RzCore *core, const int key) { } break; case '$': - rz_core_cmd0(core, "dr PC=$$"); + rz_core_debug_reg_set(core, "PC", core->offset, NULL); break; case ' ': case '\r': @@ -5519,7 +5513,8 @@ void __insert_value(RzCore *core) { if (creg) { const char *prompt = "new-reg-value> "; __panel_prompt(prompt, buf, sizeof(buf)); - rz_core_cmdf(core, "dr %s = %s", creg, buf); + ut64 regval = rz_num_math(core->num, buf); + rz_core_debug_reg_set(core, creg, regval, buf); cur->view->refresh = true; } } else if (__check_panel_type(cur, PANEL_CMD_DISASSEMBLY)) { @@ -6417,9 +6412,9 @@ repeat: break; case '$': if (core->print->cur_enabled) { - rz_core_cmdf(core, "dr PC=$$+%d", core->print->cur); + rz_core_debug_reg_set(core, "PC", core->offset + core->print->cur, NULL); } else { - rz_core_cmd0(core, "dr PC=$$"); + rz_core_debug_reg_set(core, "PC", core->offset, NULL); } break; case 's': @@ -6817,7 +6812,7 @@ repeat: (void)rz_core_cmd0(core, cmd); } else { if (__check_panel_type(cur, PANEL_CMD_DISASSEMBLY)) { - __panel_continue(core); + rz_core_debug_continue(core); __set_panel_addr(core, cur, core->offset); } } diff --git a/librz/core/visual.c b/librz/core/visual.c index 7245052817..9e47a85664 100644 --- a/librz/core/visual.c +++ b/librz/core/visual.c @@ -810,16 +810,7 @@ static void __core_visual_step_over(RzCore *core) { } static void visual_breakpoint(RzCore *core) { - rz_core_cmd(core, "dbs $$", 0); -} - -static void visual_continue(RzCore *core) { - if (rz_config_get_b(core->config, "cfg.debug")) { - rz_debug_continue_oldhandler(core, ""); - } else { - rz_core_cmd(core, "aec", 0); - rz_core_regs2flags(core); - } + rz_core_debug_breakpoint_toggle(core, core->offset); } static int visual_nkey(RzCore *core, int ch) { @@ -897,7 +888,7 @@ static int visual_nkey(RzCore *core, int ch) { if (cmd && *cmd) { ch = rz_core_cmd0(core, cmd); } else { - visual_continue(core); + rz_core_debug_continue(core); } break; case RZ_CONS_KEY_F10: @@ -2679,7 +2670,8 @@ RZ_API int rz_core_visual_cmd(RzCore *core, const char *arg) { if (*buf) { const char *creg = core->dbg->creg; if (creg) { - rz_core_cmdf(core, "dr %s = %s\n", creg, buf); + ut64 regval = rz_num_math(core->num, buf); + rz_core_debug_reg_set(core, creg, regval, buf); } } return true; @@ -3369,7 +3361,7 @@ RZ_API int rz_core_visual_cmd(RzCore *core, const char *arg) { break; case 'B': { ut64 addr = core->print->cur_enabled ? core->offset + core->print->cur : core->offset; - rz_core_cmdf(core, "dbs 0x%08" PFMT64x, addr); + rz_core_debug_breakpoint_toggle(core, addr); } break; case 'u': rz_core_visual_seek_animation_undo(core);