我的问题是关于用gdb / gdbserver的一个嵌入式处理器臂远程调试应用程序。

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

我已经确定的是,库编译与调试符号,并通过GDB装在主机端,我可以在库中列出的功能,甚至设置断点,但只要我尝试运行应用程序,我得到一个错误消息的效果:

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

其中,X是在gdb断点数目和是地址远小是有效的。结果 我使用目标和主机两个新的图书馆,而是通过对从NFS目标mount -o bind newlib oldlib安装。点击 有没有人有可能是错误的想法? 由于事先。

有帮助吗?

解决方案

野生猜测:您加载的共享库到宿主GDB在不正确的地址

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

其他提示

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

@Employed俄罗斯认为,必须使用stop-on-solib-event。这不再是真实的; NDK R 8d各自支持在尚未将待加载solibs未决断点。

@Brent Piddy说stop-on-solib-event不gdbserver的工作。这也不再是正确的,因为至少R8C。我公司拥有依赖于从GDB这个NDK行为的产品,我们将成为大麻烦离不开它了。

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

set breakpoint pending on

不幸的是,你不能使用gdbserver的远程调试,因为gdbserver的不识别/发送solib事件“中设置止损上solib事件”。我不得不只发出一组solib搜索路径或设置SYSROOT命令来获取gdb的打在主断点后,加载所有的共享库符号。

生成高达main然后set solib-search-path .

否则,gdbserver停止在动态加载,加载的库之前。在main,他们应该准备好GDB。

的更多细节:调试与gdbserver的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top