Подтвердить что ты не робот

Отладка дизассемблированных библиотек с помощью gdb

в Linux и Mac OS X Я могу использовать stepi и nexti для отладки приложения без отладки информации.

В Mac OS X gdb отображаются функции, которые вызывается внутри библиотеки, хотя иногда и несколько инструкций ассемблера в каждой инструкции stepi.

В Linux, когда я вхожу в динамическую библиотеку, gdb теряется. Например, с puts() есть три команды ассемблера внутри puts(), когда gdb достигает прыжка на 0x080482bf, он терпит неудачу с сообщением "Нет функции содержит программный счетчик для выбранного кадра".

0x080482ba in [email protected] ()
(gdb) disassemble
Dump of assembler code for function [email protected]:
0x080482b4 <[email protected]+0>:        jmp    *0x8049580
0x080482ba <[email protected]+6>:        push   $0x10
0x080482bf <[email protected]+11>:       jmp    0x8048284 <_init+48>
End of assembler dump.
(gdb) stepi
0x080482bf in [email protected] ()
(gdb) stepi
0x08048284 in ?? ()
(gdb) disassemble
No function contains program counter for selected frame.

Вы знаете, как отлаживать эти вызовы библиотеки с помощью gdb.

4b9b3361

Ответ 1

Если GDB не имеет отладочных символов для функции, которую вы пытаетесь отладить, GDB не сможет определить диапазон адресов памяти для демонтажа. Чтобы обойти это, вы можете передать диапазон в команду disassemble. Например:

(gdb) p $pc
$4 = (void (*)()) 0x70c72d <_IO_puts+29>
(gdb) disassemble 0x70c72d 0x70c740
Dump of assembler code from 0x70c72d to 0x70c740:
0x0070c72d <_IO_puts+29>:   mov    %eax,(%esp)
0x0070c730 <_IO_puts+32>:   call   0x721f10 <strlen>
0x0070c735 <_IO_puts+37>:   mov    0x84c(%ebx),%edx
0x0070c73b <_IO_puts+43>:   cmpw   $0x0,(%edx)
0x0070c73f <_IO_puts+47>:   mov    %edx,-0x10(%ebp)
End of assembler dump.

Возможно, есть способ установить символы отладки. В моей системе Ubuntu я установил пакет libc6-dbg, который позволяет мне входить в функции в стандартной библиотеке.