2009-11-06 84 views
3

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

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

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

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

其中X是断点数目在gdb和是地址远小是有效的。
我在目标主机和主机上都使用了新库,但是通过nfs mount上的目标上的mount -o bind newlib oldlib
有没有人有什么可能是错的想法? 在此先感谢。

+0

[与gdbserver的调试共享库]的可能的复制(https://stackoverflow.com/questions/8611194/debugging-shared-libraries-with-gdbserver) – 2017-10-08 07:56:11

回答

0

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

而不是明确地加载到GDB,使用"set stop-on-solib-event on",等待获得加载库(info shared会告诉你加载库的当前目录),并然后设置的断点。

0

使用下面的命令来设置挂起的断点,将得到解决共享对象库加载

set breakpoint pending on 

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

6

我看到这个问题是从2009年,但目前的答案是外的日期,所以这里的更新:

@Employed俄罗斯认为,必须使用stop-on-solib-event。这不再是事实; NDK r8d支持尚未加载的solib中的挂起断点。

@Brent Piddy说stop-on-solib-event不适用于gdbserver。至少r8c,这也不再是真实的。我的公司有一款产品依赖于GDB的这种NDK行为,如果没有它,我们将面临很大的麻烦。