mirror of
https://github.com/radareorg/radare2.git
synced 2024-12-03 02:41:08 +00:00
Enhance Vx - visual xrefs browser, with more highlight and less glitches
This commit is contained in:
parent
5f6bb5c531
commit
b7396fffa5
@ -2437,52 +2437,52 @@ static void r_core_cmd_bp(RCore *core, const char *input) {
|
|||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
switch (input[2]) {
|
switch (input[2]) {
|
||||||
case 0:
|
case 0:
|
||||||
r_bp_plugin_list (core->dbg->bp);
|
r_bp_plugin_list (core->dbg->bp);
|
||||||
break;
|
break;
|
||||||
case ' ':
|
case ' ':
|
||||||
if (!r_bp_use (core->dbg->bp, input + 3, core->anal->bits))
|
if (!r_bp_use (core->dbg->bp, input + 3, core->anal->bits))
|
||||||
eprintf ("Invalid name: '%s'.\n", input + 3);
|
eprintf ("Invalid name: '%s'.\n", input + 3);
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
default:
|
default:
|
||||||
eprintf ("Usage: dh [plugin-name] # select a debug handler plugin\n");
|
eprintf ("Usage: dh [plugin-name] # select a debug handler plugin\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ' ':
|
case ' ': // "db"
|
||||||
for (p = input + 1; *p == ' '; p++);
|
for (p = input + 1; *p == ' '; p++);
|
||||||
if (*p == '-') {
|
if (*p == '-') {
|
||||||
r_bp_del (core->dbg->bp, r_num_math (core->num, p + 1));
|
r_bp_del (core->dbg->bp, r_num_math (core->num, p + 1));
|
||||||
} else {
|
} else {
|
||||||
addr = r_num_math (core->num, input + 2);
|
addr = r_num_math (core->num, input + 2);
|
||||||
if (validAddress (core, addr)) {
|
if (validAddress (core, addr)) {
|
||||||
bpi = r_debug_bp_add (core->dbg, addr, hwbp, NULL, 0);
|
bpi = r_debug_bp_add (core->dbg, addr, hwbp, NULL, 0);
|
||||||
if (bpi) {
|
if (bpi) {
|
||||||
free (bpi->name);
|
free (bpi->name);
|
||||||
if (!strcmp (input + 2, "$$")) {
|
if (!strcmp (input + 2, "$$")) {
|
||||||
char *newname = NULL;
|
char *newname = NULL;
|
||||||
RFlagItem *f = r_flag_get_i2 (core->flags, addr);
|
RFlagItem *f = r_flag_get_i2 (core->flags, addr);
|
||||||
|
|
||||||
if (f) {
|
if (f) {
|
||||||
if (addr > f->offset) {
|
if (addr > f->offset) {
|
||||||
newname = r_str_newf ("%s+0x%" PFMT64x, f->name, addr - f->offset);
|
newname = r_str_newf ("%s+0x%" PFMT64x, f->name, addr - f->offset);
|
||||||
} else {
|
} else {
|
||||||
newname = strdup (f->name);
|
newname = strdup (f->name);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
bpi->name = newname;
|
|
||||||
} else {
|
|
||||||
bpi->name = strdup (input + 2);
|
|
||||||
}
|
}
|
||||||
|
bpi->name = newname;
|
||||||
} else {
|
} else {
|
||||||
eprintf ("Cannot set breakpoint at '%s'\n", input + 2);
|
bpi->name = strdup (input + 2);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
eprintf ("Cannot place a breakpoint on 0x%08"PFMT64x" unmapped memory. See dbg.bpinmaps\n", addr);
|
eprintf ("Cannot set breakpoint at '%s'\n", input + 2);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
eprintf ("Cannot place a breakpoint on 0x%08"PFMT64x" unmapped memory. See dbg.bpinmaps\n", addr);
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
|
break;
|
||||||
case 'i':
|
case 'i':
|
||||||
switch (input[2]) {
|
switch (input[2]) {
|
||||||
case 0: // "dbi"
|
case 0: // "dbi"
|
||||||
|
@ -734,34 +734,22 @@ repeat:
|
|||||||
r_cons_any_key (NULL);
|
r_cons_any_key (NULL);
|
||||||
r_cons_clear00 ();
|
r_cons_clear00 ();
|
||||||
} else {
|
} else {
|
||||||
|
int maxcount = 9;
|
||||||
int rows, cols = r_cons_get_size (&rows);
|
int rows, cols = r_cons_get_size (&rows);
|
||||||
idx = 0;
|
idx = 0;
|
||||||
count = 0;
|
count = 0;
|
||||||
|
char *dis = NULL;
|
||||||
rows -= 3;
|
rows -= 3;
|
||||||
// int maxcount = rows > 20 ? 9: 4;
|
|
||||||
int maxcount = cols < 90 ? 4: 9;
|
|
||||||
if (cols > 90) {
|
|
||||||
r_list_foreach (xrefs, iter, refi) {
|
|
||||||
if (idx == skip) {
|
|
||||||
char *dis = r_core_cmd_strf (core, "pd $r-10 @ 0x%08"PFMT64x, refi->addr);
|
|
||||||
char *d = r_str_ansi_crop (dis, 0, 0, cols - 50, rows - 3);
|
|
||||||
r_cons_printf ("%s", d);
|
|
||||||
r_cons_column (50);
|
|
||||||
free (d);
|
|
||||||
free (dis);
|
|
||||||
r_cons_gotoxy (1, 1);
|
|
||||||
r_cons_printf ("[GOTO XREF]> 0x%08"PFMT64x"\n", addr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
idx ++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
idx = 0;
|
idx = 0;
|
||||||
|
ut64 curat = UT64_MAX;
|
||||||
r_list_foreach (xrefs, iter, refi) {
|
r_list_foreach (xrefs, iter, refi) {
|
||||||
if (idx - skip > maxcount) {
|
if (idx - skip > maxcount) {
|
||||||
r_cons_printf ("...\n");
|
r_cons_printf ("...");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (!iter->n && idx < skip) {
|
||||||
|
skip = idx;
|
||||||
|
}
|
||||||
if (idx >= skip) {
|
if (idx >= skip) {
|
||||||
if (count > maxcount) {
|
if (count > maxcount) {
|
||||||
strcpy (cstr, "?");
|
strcpy (cstr, "?");
|
||||||
@ -787,21 +775,43 @@ repeat:
|
|||||||
name);
|
name);
|
||||||
free (name);
|
free (name);
|
||||||
if (idx == skip) {
|
if (idx == skip) {
|
||||||
if (cols <= 90) {
|
free (dis);
|
||||||
char *dis = r_core_cmd_strf (core, "pd $r-5 @ 0x%08"PFMT64x, refi->addr);
|
curat = refi->addr;
|
||||||
char *d = r_str_ansi_crop (dis, 0, 0, cols, rows - 5);
|
// TODO: show disasm with context. not seek addr
|
||||||
r_cons_printf ("%s", d);
|
// dis = r_core_cmd_strf (core, "pd $r-4 @ 0x%08"PFMT64x, refi->addr);
|
||||||
free (d);
|
dis = r_core_cmd_strf (core, "pd $r-4 @ 0x%08"PFMT64x, refi->addr - 32);
|
||||||
free (dis);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (++count >= rows) {
|
if (++count >= rows) {
|
||||||
r_cons_printf ("...\n");
|
r_cons_printf ("...");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
idx++;
|
idx++;
|
||||||
}
|
}
|
||||||
|
if (dis) {
|
||||||
|
if (count < rows) {
|
||||||
|
r_cons_newline ();
|
||||||
|
}
|
||||||
|
int i = count;
|
||||||
|
for (; i < 10; i++) {
|
||||||
|
r_cons_newline ();
|
||||||
|
}
|
||||||
|
/* prepare highlight */
|
||||||
|
char *cmd = strdup (r_config_get (core->config, "scr.highlight"));
|
||||||
|
char *ats = r_str_newf ("%"PFMT64x, curat);
|
||||||
|
r_config_set (core->config, "scr.highlight", ats);
|
||||||
|
/* print disasm */
|
||||||
|
char *d = r_str_ansi_crop (dis, 0, 0, cols, rows - 9);
|
||||||
|
r_cons_printf ("%s", d);
|
||||||
|
free (d);
|
||||||
|
/* flush and restore highlight */
|
||||||
|
r_cons_flush ();
|
||||||
|
r_config_set (core->config, "scr.highlight", cmd);
|
||||||
|
free (ats);
|
||||||
|
free (cmd);
|
||||||
|
free (dis);
|
||||||
|
dis = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
r_config_set_i (core->config, "asm.bytes", asm_bytes);
|
r_config_set_i (core->config, "asm.bytes", asm_bytes);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user