gdb反汇编:显示基16中的功能偏移

gdb反汇编:显示基16中的功能偏移,gdb,linux-kernel,backtracking,Gdb,Linux Kernel,Backtracking,当反汇编函数时,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>:

当反汇编函数时,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)
(gdb)反汇编取消注册\u sysctl\u表
函数unregister\u sysctl\u表的汇编程序代码转储:
0x00037080:推送%ebp
0x00037081:mov%esp,%ebp
0x00037083:子$0x14,%esp
0x00037086:mov%ebx,-0xc(%ebp)
0x00037089:mov%esi,-0x8(%ebp)
0x0003708c:mov%eax,%ebx
0x0003708e:mov%edi,-0x4(%ebp)
函数偏移量是地址旁边的
,正如您可以看到的,它们位于基数10中

当Linux内核崩溃时,它会使用base 16显示回溯:

 [    0.524380]  [<c10381d5>] unregister_sysctl_table+0x65/0x70
[0.524380][]注销sysctl表+0x65/0x70
必须将回溯地址从基16转换为基10才能找到所需的指令,这非常烦人


是否可以告诉gdb显示具有基16偏移量的反汇编输出?

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

您必须修补gdb以十六进制显示偏移量

例如,在gdb 6.8中

更改cli out.c、mi/mi out.c、tui/tui out.c中的*字段\u 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);