mirror of
https://github.com/radareorg/radare2.git
synced 2025-02-15 03:38:27 +00:00
Fix #793 - Display changed registers in every 'dr' command
- Do not always colorize the modified reg in 'dr' - TODO: Add color palette for reg highlighting
This commit is contained in:
parent
d6c2866ab6
commit
01b8b2d763
@ -125,7 +125,7 @@ static int var_cmd(RCore *core, const char *str) {
|
|||||||
int size = 4;
|
int size = 4;
|
||||||
char *name = "num";
|
char *name = "num";
|
||||||
r_anal_var_add (core->anal,
|
r_anal_var_add (core->anal,
|
||||||
fcn->addr,
|
fcn->addr,
|
||||||
scope, delta, kind, type, size, name);
|
scope, delta, kind, type, size, name);
|
||||||
//r_anal_str_to_type (core->anal, p)
|
//r_anal_str_to_type (core->anal, p)
|
||||||
//NULL, p3? atoi (p3): 0, p2);
|
//NULL, p3? atoi (p3): 0, p2);
|
||||||
@ -653,15 +653,17 @@ static int cmd_anal_fcn(RCore *core, const char *input) {
|
|||||||
static void __anal_reg_list (RCore *core, int type, int size, char mode) {
|
static void __anal_reg_list (RCore *core, int type, int size, char mode) {
|
||||||
RReg *hack = core->dbg->reg;
|
RReg *hack = core->dbg->reg;
|
||||||
int bits = core->anal->bits;
|
int bits = core->anal->bits;
|
||||||
|
int use_colors = r_config_get_i(core->config, "scr.color");
|
||||||
core->dbg->reg = core->anal->reg;
|
core->dbg->reg = core->anal->reg;
|
||||||
type = R_REG_TYPE_GPR;
|
type = R_REG_TYPE_GPR;
|
||||||
r_debug_reg_list (core->dbg, type, bits, mode);
|
r_debug_reg_list (core->dbg, type, bits, mode, use_colors);
|
||||||
core->dbg->reg = hack;
|
core->dbg->reg = hack;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cmd_anal_reg(RCore *core, const char *str) {
|
static void cmd_anal_reg(RCore *core, const char *str) {
|
||||||
int size = 0, i, type = R_REG_TYPE_GPR;
|
int size = 0, i, type = R_REG_TYPE_GPR;
|
||||||
int bits = (core->anal->bits & R_SYS_BITS_64)? 64: 32;
|
int bits = (core->anal->bits & R_SYS_BITS_64)? 64: 32;
|
||||||
|
int use_colors = r_config_get_i(core->config, "scr.color");
|
||||||
struct r_reg_item_t *r;
|
struct r_reg_item_t *r;
|
||||||
const char *name;
|
const char *name;
|
||||||
char *arg;
|
char *arg;
|
||||||
@ -790,16 +792,16 @@ free (rf);
|
|||||||
else eprintf ("Oops. try drn [pc|sp|bp|a0|a1|a2|a3|zf|sf|nf|of]\n");
|
else eprintf ("Oops. try drn [pc|sp|bp|a0|a1|a2|a3|zf|sf|nf|of]\n");
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 3); // XXX detect which one is current usage
|
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 3, use_colors); // XXX detect which one is current usage
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
r_reg_arena_swap (core->dbg->reg, R_FALSE);
|
r_reg_arena_swap (core->dbg->reg, R_FALSE);
|
||||||
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 0); // XXX detect which one is current usage
|
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 0, use_colors); // XXX detect which one is current usage
|
||||||
r_reg_arena_swap (core->dbg->reg, R_FALSE);
|
r_reg_arena_swap (core->dbg->reg, R_FALSE);
|
||||||
break;
|
break;
|
||||||
case '=':
|
case '=':
|
||||||
if (r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE)) {
|
if (r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE)) {
|
||||||
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 2); // XXX detect which one is current usage
|
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 2, use_colors); // XXX detect which one is current usage
|
||||||
} //else eprintf ("Cannot retrieve registers from pid %d\n", core->dbg->pid);
|
} //else eprintf ("Cannot retrieve registers from pid %d\n", core->dbg->pid);
|
||||||
break;
|
break;
|
||||||
case '*':
|
case '*':
|
||||||
@ -842,6 +844,7 @@ static int cmd_anal(void *data, const char *input) {
|
|||||||
const char *ptr;
|
const char *ptr;
|
||||||
RCore *core = (RCore *)data;
|
RCore *core = (RCore *)data;
|
||||||
int l, len = core->blocksize;
|
int l, len = core->blocksize;
|
||||||
|
int use_colors = r_config_get_i(core->config, "scr.color");
|
||||||
ut64 addr = core->offset;
|
ut64 addr = core->offset;
|
||||||
ut32 tbs = core->blocksize;
|
ut32 tbs = core->blocksize;
|
||||||
|
|
||||||
@ -863,7 +866,7 @@ static int cmd_anal(void *data, const char *input) {
|
|||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
if (input[1] == 'r') {
|
if (input[1] == 'r') {
|
||||||
r_debug_reg_list (core->dbg, 0, 0, 0);
|
r_debug_reg_list (core->dbg, 0, 0, 0, use_colors);
|
||||||
} else if (input[1] == ' ') {
|
} else if (input[1] == ' ') {
|
||||||
r_anal_esil_eval (core->anal, input+2);
|
r_anal_esil_eval (core->anal, input+2);
|
||||||
} else eprintf ("Usage: ae [esil] # wip. analyze esil. (evaluable string intermediate language)\n");
|
} else eprintf ("Usage: ae [esil] # wip. analyze esil. (evaluable string intermediate language)\n");
|
||||||
|
@ -405,6 +405,7 @@ static int cmd_debug_map(RCore *core, const char *input) {
|
|||||||
static void cmd_debug_reg(RCore *core, const char *str) {
|
static void cmd_debug_reg(RCore *core, const char *str) {
|
||||||
int size, i, type = R_REG_TYPE_GPR;
|
int size, i, type = R_REG_TYPE_GPR;
|
||||||
int bits = (core->dbg->bits & R_SYS_BITS_64)? 64: 32;
|
int bits = (core->dbg->bits & R_SYS_BITS_64)? 64: 32;
|
||||||
|
int use_colors = r_config_get_i(core->config, "scr.color");
|
||||||
struct r_reg_item_t *r;
|
struct r_reg_item_t *r;
|
||||||
const char *name;
|
const char *name;
|
||||||
char *arg;
|
char *arg;
|
||||||
@ -583,26 +584,26 @@ free (rf);
|
|||||||
else eprintf ("Oops. try drn [pc|sp|bp|a0|a1|a2|a3|zf|sf|nf|of]\n");
|
else eprintf ("Oops. try drn [pc|sp|bp|a0|a1|a2|a3|zf|sf|nf|of]\n");
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 3); // XXX detect which one is current usage
|
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 3, use_colors); // XXX detect which one is current usage
|
||||||
break;
|
break;
|
||||||
case 'o':
|
case 'o':
|
||||||
r_reg_arena_swap (core->dbg->reg, R_FALSE);
|
r_reg_arena_swap (core->dbg->reg, R_FALSE);
|
||||||
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 0); // XXX detect which one is current usage
|
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 0, use_colors); // XXX detect which one is current usage
|
||||||
r_reg_arena_swap (core->dbg->reg, R_FALSE);
|
r_reg_arena_swap (core->dbg->reg, R_FALSE);
|
||||||
break;
|
break;
|
||||||
case '=':
|
case '=':
|
||||||
if (r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE)) {
|
if (r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE)) {
|
||||||
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 2); // XXX detect which one is current usage
|
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, 2, use_colors); // XXX detect which one is current usage
|
||||||
} //else eprintf ("Cannot retrieve registers from pid %d\n", core->dbg->pid);
|
} //else eprintf ("Cannot retrieve registers from pid %d\n", core->dbg->pid);
|
||||||
break;
|
break;
|
||||||
case '*':
|
case '*':
|
||||||
if (r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE))
|
if (r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE))
|
||||||
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, '*');
|
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, '*', use_colors);
|
||||||
break;
|
break;
|
||||||
case 'j':
|
case 'j':
|
||||||
case '\0':
|
case '\0':
|
||||||
if (r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE)) {
|
if (r_debug_reg_sync (core->dbg, R_REG_TYPE_GPR, R_FALSE)) {
|
||||||
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, str[0]);
|
r_debug_reg_list (core->dbg, R_REG_TYPE_GPR, bits, str[0], use_colors);
|
||||||
} else
|
} else
|
||||||
eprintf ("Cannot retrieve registers from pid %d\n", core->dbg->pid);
|
eprintf ("Cannot retrieve registers from pid %d\n", core->dbg->pid);
|
||||||
break;
|
break;
|
||||||
@ -633,7 +634,7 @@ free (rf);
|
|||||||
}
|
}
|
||||||
if (type != R_REG_TYPE_LAST) {
|
if (type != R_REG_TYPE_LAST) {
|
||||||
r_debug_reg_sync (core->dbg, type, R_FALSE);
|
r_debug_reg_sync (core->dbg, type, R_FALSE);
|
||||||
r_debug_reg_list (core->dbg, type, size, str[0]=='*');
|
r_debug_reg_list (core->dbg, type, size, str[0]=='*', use_colors);
|
||||||
} else eprintf ("cmd_debug_reg: Unknown type\n");
|
} else eprintf ("cmd_debug_reg: Unknown type\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ repeat:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
R_API int r_debug_reg_list(RDebug *dbg, int type, int size, int rad) {
|
R_API int r_debug_reg_list(RDebug *dbg, int type, int size, int rad, int use_colors) {
|
||||||
int i, delta, from, to, cols, n = 0;
|
int i, delta, from, to, cols, n = 0;
|
||||||
const char *fmt, *fmt2, *kwhites;
|
const char *fmt, *fmt2, *kwhites;
|
||||||
RListIter *iter;
|
RListIter *iter;
|
||||||
@ -107,7 +107,7 @@ R_API int r_debug_reg_list(RDebug *dbg, int type, int size, int rad) {
|
|||||||
{
|
{
|
||||||
char whites[16];
|
char whites[16];
|
||||||
strcpy (whites, kwhites);
|
strcpy (whites, kwhites);
|
||||||
if (delta) // TODO: DO NOT COLORIZE ALWAYS ..do debug knows about console?? use inverse colors
|
if (delta && use_colors) // TODO: do debug knows about console?? use inverse colors for clear bg
|
||||||
dbg->printf (Color_BWHITE);
|
dbg->printf (Color_BWHITE);
|
||||||
if (item->flags) {
|
if (item->flags) {
|
||||||
char *str = r_reg_get_bvalue (dbg->reg, item);
|
char *str = r_reg_get_bvalue (dbg->reg, item);
|
||||||
@ -137,7 +137,7 @@ R_API int r_debug_reg_list(RDebug *dbg, int type, int size, int rad) {
|
|||||||
((n+1)%cols)? whites: "\n");
|
((n+1)%cols)? whites: "\n");
|
||||||
|
|
||||||
}
|
}
|
||||||
if (delta) // TODO: only in color mode ON
|
if (delta && use_colors) // TODO: same as above
|
||||||
dbg->printf (Color_RESET);
|
dbg->printf (Color_RESET);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -150,7 +150,11 @@ R_API int r_debug_reg_list(RDebug *dbg, int type, int size, int rad) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
if (delta && use_colors) // TODO: same as above
|
||||||
|
dbg->printf (Color_BWHITE);
|
||||||
dbg->printf (fmt, item->name, value, "\n");
|
dbg->printf (fmt, item->name, value, "\n");
|
||||||
|
if (delta && use_colors) // TODO: same as above
|
||||||
|
dbg->printf (Color_RESET);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
n++;
|
n++;
|
||||||
|
@ -298,7 +298,7 @@ R_API int r_debug_desc_list(RDebug *dbg, int rad);
|
|||||||
|
|
||||||
/* registers */
|
/* registers */
|
||||||
R_API int r_debug_reg_sync(RDebug *dbg, int type, int write);
|
R_API int r_debug_reg_sync(RDebug *dbg, int type, int write);
|
||||||
R_API int r_debug_reg_list(RDebug *dbg, int type, int size, int rad);
|
R_API int r_debug_reg_list(RDebug *dbg, int type, int size, int rad, int use_colors);
|
||||||
R_API int r_debug_reg_set(RDebug *dbg, const char *name, ut64 num);
|
R_API int r_debug_reg_set(RDebug *dbg, const char *name, ut64 num);
|
||||||
R_API ut64 r_debug_reg_get(RDebug *dbg, const char *name);
|
R_API ut64 r_debug_reg_get(RDebug *dbg, const char *name);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user