我的问题是使用gdb / gdbserver远程调试嵌入式arm处理器上的应用程序。
我可以调试应用程序本身,但应用程序动态链接到实现内部通信协议的共享库。我希望能够在共享库函数中设置断点,以便尝试找出一些设备发现问题。
我确保使用调试符号编译库并在主机端由gdb加载,我可以列出库中的函数,甚至设置断点但是一旦我尝试运行应用程序,我得到一个错误消息的效果:
Cannot insert breakpoint X.
Error accessing memory address : Input/output error.
其中X是gdb中的断点号,是一个很小的地址,有效
我在目标和主机上使用新库,但是通过nfs mount上的目标上的mount -o bind newlib oldlib
。
有没有人知道可能出现什么问题?
提前谢谢。
答案 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做好准备。