Refactor to use API in visual panels mode (#556)

This commit is contained in:
Anton Kochkov 2021-02-10 16:49:17 +08:00 committed by GitHub
parent 3b4ed65c66
commit aa3558b294
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 62 additions and 61 deletions

View file

@ -3,6 +3,7 @@
#include <rz_core.h>
#include <rz_debug.h>
#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);
}

View file

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

View file

@ -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] == '?') {

View file

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

View file

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

View file

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