我的问题是使用gdb / gdbserver在embedded式arm处理器上远程debugging应用程序。
我可以debugging应用程序本身,但应用程序dynamic链接到实现内部通信协议的共享库。 我希望能够在共享库函数中设置断点,以便弄清楚一些设备发现问题。
我已经确定该库是用debugging符号编译的,并在主机端由gdb加载,我可以列出库中的函数,甚至设置断点,但只要我尝试运行应用程序,我收到一条错误消息的效果:
Cannot insert breakpoint X.
Error accessing memory address : Input/output error.
共享库的Makefile?
Linux共享库c ++
如何编译以避免共享库错误?
使用JNI加载一个dynamicC共享库,同时加载另一个共享库
其中X是gdb中的断点编号,并且是一个远或小的有效地址。
我在目标机和主机上都使用了这个新的库,但是通过mount -o bind newlib oldlib上的mount -o bind newlib oldlib到目标上。
有没有人有什么可能是错的想法? 提前致谢。
为什么我必须使用LD_PRELOAD for libcl.2在HP / UX上使用XML :: LibXML :: Common?
在共享库的构build选项中添加“-rpath,/ usr / lib”会导致段错误
为什么我的Linux应用程序拉错了.so库?
如何列出c / c ++静态库的依赖关系?
如何将共享库黑名单以避免由加载程序获取?
狂猜:你把共享库加载到主机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调试共享库
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。