gpt4 book ai didi

assembly - 使用gdb作为监视器?

转载 作者:行者123 更新时间:2023-12-02 22:02:06 24 4
gpt4 key购买 nike

GDB 可以像传统的汇编监视器一样使用吗?

一旦你踏入例如。它返回的库代码:

No function contains program counter for selected frame

GDB 调试器能够单步执行未知代码,但GDB UI停止工作。

在此相关question您可以找到一对建议的解决方案,但都不能令我满意。

如果二进制库没有附带调试符号包怎么办?如果程序跳转到运行时生成的代码怎么办?

反汇编代码也不是真正的解决方案,因为 UI 会忽略它,最重要的是,在返回原始已知代码之前,寄存器的值不会更新。 信息寄存器可以工作,但是几乎没有交互性。

有什么建议吗?

谢谢!

最佳答案

您可以使用 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)

关于assembly - 使用gdb作为监视器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2160037/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com