Вы можете сделать это с помощью команды 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)