Используя gdb как монитор?

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

Как только Вы ступаете в, например, библиотека кодируют его возвраты:

No function contains program counter for selected frame

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

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

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

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

Какое-либо предложение?

Спасибо!

5
задан Community 23 May 2017 в 10:26
поделиться

1 ответ

Это можно сделать командой 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 , чтобы удалить их). Например, чтобы посмотреть, что происходит с %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) 
8
ответ дан 14 December 2019 в 04:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: