7

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

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

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

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

其中 X 是 gdb 中的断点编号,并且是一个小到有效的地址。
我在目标和主机上都使用新库,但是通过mount -o bind newlib oldlibnfs 挂载的目标。
有谁知道可能出了什么问题?提前致谢。

4

4 回答 4

6

我看到这个问题来自 2009 年,但当前的答案已经过时,所以这里有一个更新:

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

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

于 2013-01-14T23:38:26.467 回答
0

疯狂的猜测:您将共享库加载到GDB了错误地址的主机中。

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

于 2009-11-07T07:05:52.323 回答
0

使用以下命令设置挂起的断点,这些断点将在加载共享对象库后得到解决

set breakpoint pending on

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

于 2012-11-08T16:55:45.783 回答
0

跑到main然后set solib-search-path .

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

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

于 2017-07-22T08:40:58.397 回答