强制gdb使用提供的线程库

时间:2019-04-25 07:37:06

标签: gdb

我有一个嵌入式ARM应用程序,该应用程序与所有剥离的so-libraries(包括libpthread.so)捆绑在一起。有时,应用程序陷入了代码的某些部分,我希望能够使用gdb附加到它,并查看发生了什么。问题在于gdb拒绝使用以下消息加载所需的线程支持库:

Trying host libthread_db library: /home/me/debug_libs/libthread_db.so.1.
td_ta_new failed: application not linked with libthread
thread_db_load_search returning 0
warning: Unable to find libthread_db matching inferior's thread 
library, thread debugging will not be available.

因此,我无法调试应用程序,例如我看不到所有线程的当前调用堆栈。 经过一番调查,我怀疑td_ta_new失败的application not linked with libthread是由libpthread的剥离版本引起的,该剥离版本缺少nptl_version符号。有什么办法可以绕过错误? gdb是为ARM编译的,可以在设备本身上运行。我没有解压缩版本的库,但是该应用程序已经在与剥离的库一起运行。

1 个答案:

答案 0 :(得分:1)

  

有什么办法可以绕过错误?

想到的几种方法:

  1. 使用add-symbol-file用未剥离的数字覆盖已剥离的libpthread.so.0

    (gdb) info shared libpthread.so # shows the path and memory address where stripped libpthread.so.0 is loaded (gdb) add-symbol-file /path/to/unstripped/libpthread.so.0 $address # should override with new symbols, and attempt to re-load libthread_db.so.1

  2. 运行gdb -ex 'set sysroot /path/to/unstripped' ...,其中/path/to/unstripped是已安装树的镜像路径(也就是说,如果您使用的是/lib/libpthread.so.0,则应该是/path/to/unstripped/lib/libpthread.so.0

    我还没有测试过,但是我认为它应该可以工作。

  3. 您可以注释掉GDB中的版本检查并重新构建。