使用gdb / gdbserver远程调试共享库

时间:2009-11-06 19:00:37

标签: linux gdb shared-libraries arm remote-debugging

我的问题是使用gdb / gdbserver远程调试嵌入式arm处理器上的应用程序。

我可以调试应用程序本身,但应用程序动态链接到实现内部通信协议的共享库。我希望能够在共享库函数中设置断点,以便尝试找出一些设备发现问题。

我确保使用调试符号编译库并在主机端由gdb加载,我可以列出库中的函数,甚至设置断点但是一旦我尝试运行应用程序,我得到一个错误消息的效果:

Cannot insert breakpoint X.
Error accessing memory address : Input/output error.

其中X是gdb中的断点号,是一个很小的地址,有效 我在目标和主机上使用新库,但是通过nfs mount上的目标上的mount -o bind newlib oldlib。 有没有人知道可能出现什么问题? 提前谢谢。

4 个答案:

答案 0 :(得分:6)

我看到这个问题是从2009年开始的,但目前的答案已经过时了,所以这是一个更新:

@Employed Russian建议你必须使用stop-on-solib-event。这不再是真的; NDK r8d支持尚未加载的solib中的挂起断点。

@Brent Piddy说stop-on-solib-event不适用于gdbserver。至少从r8c开始,这也不再适用。我公司的产品依赖于GDB的这种NDK行为,没有它我们就会遇到大麻烦。

答案 1 :(得分:0)

狂野猜测:您将共享库加载到主机GDB的地址不正确。

使用"set stop-on-solib-event on"而不是显式加载到GDB中,等待库加载(info shared将告诉您当前加载的库列表),然后然后设置断点。

答案 2 :(得分:0)

使用以下命令设置在加载共享对象库后将解析的挂起断点

set breakpoint pending on

遗憾的是,由于gdbserver无法识别/发送solib事件,因此无法对gdbserver远程调试使用“set stop-on-solib-event on”。我不得不发出一个set solib-search-path或set sysroot命令让gdb在主服务器上点击断点后加载所有共享库符号。

答案 3 :(得分:0)

最多可以main,然后set solib-search-path .

否则,gdbserver在加载库之前停止在动态加载器上。在main,他们应该为GDB做好准备。

更多详情:Debugging shared libraries with gdbserver

相关问题