我有一个嵌入式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编译的,可以在设备本身上运行。我没有解压缩版本的库,但是该应用程序已经在与剥离的库一起运行。
答案 0 :(得分: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
运行gdb -ex 'set sysroot /path/to/unstripped' ...
,其中/path/to/unstripped
是已安装树的镜像路径(也就是说,如果您使用的是/lib/libpthread.so.0
,则应该是/path/to/unstripped/lib/libpthread.so.0
。>
我还没有测试过,但是我认为它应该可以工作。
您可以注释掉GDB中的版本检查并重新构建。