GDB дизассемблировать: показать смещения функций в базе 16 - PullRequest
6 голосов
/ 18 мая 2011

При разборке функций 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, отображается обратная трассировка с использованием базы 16:

 [    0.524380]  [<c10381d5>] unregister_sysctl_table+0x65/0x70

Это оченьраздражает необходимость преобразовывать адреса обратной трассировки из базы 16 в базу 10. чтобы можно было найти нужную инструкцию.

Можно ли gdb показать вывод вывода разборки со смещением базы 16?

Ответы [ 2 ]

4 голосов
/ 18 мая 2011

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 голос
/ 19 мая 2015

Вы должны исправить GDB, чтобы показать смещение в шестнадцатеричном виде.

например, в ГБД 6,8,

изменить * _field_int в cli-out.c, mi / mi-out.c, tui / tui-out.c

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