当反汇编功能时, gdb 将显示基数为16的存储器地址,但在基数为10时会有偏移量。
示例:
(gdb) disassemble unregister_sysctl_table
Dump of assembler code for function unregister_sysctl_table:
0x00037080 <+0>: push %ebp
0x00037081 <+1>: mov %esp,%ebp
0x00037083 <+3>: sub $0x14,%esp
0x00037086 <+6>: mov %ebx,-0xc(%ebp)
0x00037089 <+9>: mov %esi,-0x8(%ebp)
0x0003708c <+12>:mov %eax,%ebx
0x0003708e <+14>:mov %edi,-0x4(%ebp)
功能偏移是地址旁边的<+N>
,正如您所看到的那样,它们位于基数10中。
当Linux内核崩溃时,它会显示使用base 16的回溯:
[ 0.524380] [<c10381d5>] unregister_sysctl_table+0x65/0x70
必须将回溯地址从基数16转换为基数10才能找到所需的指令,这非常烦人。
可以告诉 gdb 显示基础16偏移的反汇编输出吗?
答案 0 :(得分:4)
GDB目前使用硬编码'%d'作为偏移量。
必须转换回溯地址...才能找到所需的指令非常烦人
你意识到你可以做到
x/i 0xc10381d5 # the crashing instruction (if looking at the inner frame)
x/i 0xc10381d5-5 # the call (if looking at caller frame)
x/10i 0xc10381d5-20 # context around the desired location
答案 1 :(得分:1)
你必须修补gdb以十六进制显示偏移量。
例如,在gdb 6.8中,
在cli-out.c,mi / mi-out.c,tui / tui-out.c中更改* _field_int
void
cli_field_int (struct ui_out *uiout, int fldno, int width,
enum ui_align alignment,
const char *fldname, int value)
{
char buffer[40]; /* FIXME: how many chars long a %d can become? */
cli_out_data *data = ui_out_data (uiout);
if (data->suppress_output)
return;
sprintf (buffer, "%d:%X", value, value);
cli_field_string (uiout, fldno, width, alignment, fldname, buffer);