使用gdb / gdbserver远程debugging共享库

我的问题是使用gdb / gdbserver在embedded式arm处理器上远程debugging应用程序。

我可以debugging应用程序本身,但应用程序dynamic链接到实现内部通信协议的共享库。 我希望能够在共享库函数中设置断点,以便弄清楚一些设备发现问题。

我已经确定该库是用debugging符号编译的,并在主机端由gdb加载,我可以列出库中的函数,甚至设置断点,但只要我尝试运行应用程序,我收到一条错误消息的效果:

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

其中X是gdb中的断点编号,并且是一个远或小的有效地址。
我在目标机和主机上都使用了这个新的库,但是通过mount -o bind newlib oldlib上的mount -o bind newlib oldlib到目标上。
有没有人有什么可能是错的想法? 提前致谢。

Solutions Collecting From Web of "使用gdb / gdbserver远程debugging共享库"

狂猜:你把共享库加载到主机GDB的地址不正确。

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

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

@雇佣俄罗斯人建议你必须使用stop-on-solib-event 。 这不再是事实; NDK r8d支持尚未加载的solib中的挂起断点。

@Brent Piddy说stop-on-solib-event不适用于gdbserver。 至少r8c,这也是不正确的。 我的公司有一个产品,它依赖于这个来自GDB的NDK行为,如果没有它,我们会遇到很大的麻烦。

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

 set breakpoint pending on 

可悲的是你不能使用“set stop-on-solib-event on”进行gdbserver远程调试,因为gdbserver不能识别/发送solib事件。 我必须发出一个solib-search-path或set sysroot命令来让gdb在main上打断点后加载所有的共享库符号。

运行到main ,然后set solib-search-path .

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

更多细节: 用gdbserver调试共享库