代码之家  ›  专栏  ›  技术社区  ›  asm

使用gdb/gdbserver远程调试共享库

  •  4
  • asm  · 技术社区  · 15 年前

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

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

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

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

    其中x是gdb中的断点编号,是远远小于有效值的地址。
    我在目标机和主机上都使用新库,但是通过 mount -o bind newlib oldlib 在目标上从一个NFS装载。
    有人知道可能出什么问题吗? 事先谢谢。

    4 回复  |  直到 7 年前
        1
  •  0
  •   Employed Russian    15 年前

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

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

        2
  •  6
  •   Cognitive Hazard    11 年前

    我看到这个问题是从2009年开始的,但是目前的答案已经过时了,所以这里有一个更新:

    @受雇的俄罗斯人建议你必须使用 stop-on-solib-event .这不再正确;ndk r8d支持尚未加载的solibs中的挂起断点。

    @布伦特·皮迪说 Solib事件停止 不适用于gdbserver。这也不再是真的,因为至少R8C。我的公司有一个产品依赖于GDB的这种NDK行为,如果没有它,我们将陷入大麻烦。

        3
  •  0
  •   Brent Priddy    12 年前

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

    set breakpoint pending on
    

    遗憾的是,您不能将“set stop on solib event on”用于gdbserver远程调试,因为gdbserver无法识别/发送solib事件。我只需要发出set-solib搜索路径或set-sysroot命令,让gdb在命中main上的断点后加载所有共享库符号。

        4
  •  0
  •   Ciro Santilli OurBigBook.com    7 年前

    奔向 main 然后 set solib-search-path .

    否则, gdbserver 在加载库之前,在动态加载程序处停止。AT 主要的 ,它们应该为gdb做好准备。

    更多细节: Debugging shared libraries with gdbserver