Используя GDB в качестве монитора? - PullRequest
5 голосов
/ 29 января 2010

Можно ли использовать GDB, как если бы это был традиционный монитор сборки?

Как только вы вступите, например, в. код библиотеки, который он возвращает:

No function contains program counter for selected frame

GDB отладчик может войти в неизвестный код, но GDB пользовательский интерфейс перестает работать.

В этом связанном вопросе вы можете найти пару предложенных решений, но ни одно из них не удовлетворяет меня.

Что если бинарная библиотека не поставляется с пакетом символов отладки? Что если программа перейдет в сгенерированный во время выполнения код?

Разборка кода на самом деле не является решением, поскольку пользовательский интерфейс игнорирует его, что наиболее важно, значения регистров не обновляются, пока вы не вернетесь к исходному известному коду. info registers работает, но вряд ли это интерактивно.

Есть предложения?

Спасибо!

1 Ответ

8 голосов
/ 30 января 2010

Вы можете сделать это с помощью команды display.

display/i $pc разберет текущую инструкцию непосредственно перед запросом печатается каждый раз:

(gdb) b main
Breakpoint 1 at 0x80483b5: file hw.c, line 5.
(gdb) display/i $pc
(gdb) r
Starting program: /tmp/hw

Breakpoint 1, main () at hw.c:5
5         puts("Hello world");
1: x/i $pc
0x80483b5 <main+17>:    movl   $0x8048490,(%esp)

Теперь выполните команду (затем просто продолжайте нажимать Enter, чтобы повторить):

(gdb) si
0x080483bc      5         puts("Hello world");
1: x/i $pc
0x80483bc <main+24>:    call   0x80482d4 <puts@plt>
(gdb) 
0x080482d4 in puts@plt ()
1: x/i $pc
0x80482d4 <puts@plt>:   jmp    *0x804959c
Current language:  auto; currently asm
(gdb) 
0x080482da in puts@plt ()
1: x/i $pc
0x80482da <puts@plt+6>: push   $0x10
(gdb) 
0x080482df in puts@plt ()
1: x/i $pc
0x80482df <puts@plt+11>:        jmp    0x80482a4 <_init+48>

Это все еще работает, когда мы доходим до этой точки:

(gdb) 
0x080482a4 in ?? ()
1: x/i $pc
0x80482a4 <_init+48>:   pushl  0x804958c
(gdb) 
0x080482aa in ?? ()
1: x/i $pc
0x80482aa <_init+54>:   jmp    *0x8049590
(gdb) 
0xb7f052d0 in _dl_runtime_resolve () from /lib/ld-linux.so.2
1: x/i $pc
0xb7f052d0 <_dl_runtime_resolve>:       push   %eax

Более одного выражения display может быть активным одновременно (используйте undisplay <number>, чтобы удалить их). Например, чтобы посмотреть, что происходит с %eax:

(gdb) display/x $eax
2: /x $eax = 0xbf90ab34
(gdb) si
0xb7f052d1 in _dl_runtime_resolve () from /lib/ld-linux.so.2
2: /x $eax = 0xbf90ab34
1: x/i $pc
0xb7f052d1 <_dl_runtime_resolve+1>:     push   %ecx
(gdb) 
0xb7f052d2 in _dl_runtime_resolve () from /lib/ld-linux.so.2
2: /x $eax = 0xbf90ab34
1: x/i $pc
0xb7f052d2 <_dl_runtime_resolve+2>:     push   %edx
(gdb) 
0xb7f052d3 in _dl_runtime_resolve () from /lib/ld-linux.so.2
2: /x $eax = 0xbf90ab34
1: x/i $pc
0xb7f052d3 <_dl_runtime_resolve+3>:     mov    0x10(%esp),%edx
(gdb) 
0xb7f052d7 in _dl_runtime_resolve () from /lib/ld-linux.so.2
2: /x $eax = 0xbf90ab34
1: x/i $pc
0xb7f052d7 <_dl_runtime_resolve+7>:     mov    0xc(%esp),%eax

... и здесь видно изменение %eax:

(gdb) 
0xb7f052db in _dl_runtime_resolve () from /lib/ld-linux.so.2
2: /x $eax = 0xb7f0d668
1: x/i $pc
0xb7f052db <_dl_runtime_resolve+11>:    call   0xb7eff780 <_dl_fixup>
(gdb) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...