Debugging 使用gdb和gdbserver远程设置断点

Debugging 使用gdb和gdbserver远程设置断点,debugging,gdb,breakpoints,gdbserver,Debugging,Gdb,Breakpoints,Gdbserver,我正在远程主机上调试易受攻击的应用程序。我已在主机上使用以下设置gbserver: gdbserver host:1234 /my/target/app 在我的本地主机上,我已连接到: $ gdb /same/target/app gdb$ target extended-remote 192.168.0.100:1234 我连接成功,可以继续在目标指令上设置断点,即: $gdb disas vuln_function .... 0x08048e6b <+116>: r

我正在远程主机上调试易受攻击的应用程序。我已在主机上使用以下设置gbserver:

gdbserver host:1234 /my/target/app
在我的本地主机上,我已连接到:

$ gdb /same/target/app
gdb$ target extended-remote 192.168.0.100:1234
我连接成功,可以继续在目标指令上设置断点,即:

$gdb disas vuln_function
....
   0x08048e6b <+116>:   ret
End of assembler dump.
gdb$ b *0x08048e6b
Breakpoint 1 at 0x8048e6b
$gdb disas vuln\u函数
....
0x08048e6b:ret
汇编程序转储结束。
gdb$b*0x08048e6b
断点1位于0x8048e6b
查看反汇编的函数代码,并在主机本身上进行了测试,我100%确定我断开了正确的地址,并且在任何情况下,我触发了缓冲区溢出,这应该会使gdb自行断开

但是没有在我的gdb客户端上获得通常的断点,什么也没有发生。gdbserver在BO上冻结(所以我猜它确实在ret上中断了),而没有抛出SEGFULT。除了没有在断点上给我提示之外,gdb似乎没有崩溃或行为异常


在使用gdbserver进行调试时,是否有特殊的方法设置断点?

在使用gdbserver进行调试时,是否有特殊的方法设置断点

不,它应该和本地调试一样工作

首先,通过在本地主机上进行远程调试(gdb和gdbserver都在本地主机上运行),您应该确信您的设置是合理的


如果这样做有效,您的问题可能是本地gdb和远程目标进程使用不同的应用程序二进制文件(或不同的
libc.so
)。

在使用gdbserver进行调试时,是否有特殊的方法设置断点?

确保已使用调试符号编译可执行文件
-g-O0
调试远程时,gdb客户端不知道从何处加载符号。您有两个选择:

1. specify executable when starting gdb

gdb <executable>
(gdb) target remote <IP>:<port>
(gdb) load <executable>
 gdb should know symbols now
(gdb) b main
(gdb) mon reset
(gdb) contnue
 it should break at main
(gdb) bt

2. use file command to tell about the symbols.

gdb
(gdb) target remote <IP>:<port>
(gdb) load <executable>
(gdb) file <executable>
 gdb should know symbols now
(gdb) b main
(gdb) mon reset
(gdb) contnue
 it should break at main
(gdb) bt
1。在启动gdb时指定可执行文件
gdb
(gdb)目标远程:
(gdb)负载
gdb现在应该知道符号了
(gdb)b干管
(gdb)mon重置
(gdb)contnue
总的来说应该是坏的
(gdb)英国电信
2.使用文件命令说明符号。
gdb
(gdb)目标远程:
(gdb)负载
(gdb)文件
gdb现在应该知道符号了
(gdb)b干管
(gdb)mon重置
(gdb)contnue
总的来说应该是坏的
(gdb)英国电信

如果是共享库问题,在从远程机器而不是本地机器连接读取库之前,您应该能够使用“set sysroot remote:”。