gdb:找不到新线程:系统更新后出现一般错误



我在运行我的应用程序的ARM板上运行基于OpenEmbedded的Linux。我曾经运行内核 2.6.35、gdb 6.8 和 gcc 4.3。最近我将系统更新到内核 2.6.37、gdb 7.4(也尝试过 7.3)和 gcc 4.6。

现在,我的应用程序无法再调试(在ARM板上),每次我尝试在gdb中运行它时,我都会收到错误"gdb:找不到新线程:一般错误"。该应用程序使用 pthreads 并链接到 pthreads(readelf 将 libpthread.so.0 列为依赖项)。到目前为止,我找到的建议解决方案都建议链接到我已经在做的 pthread。我发现的另一个建议是使用 LD_PRELOAD=/lib/libpthread.so.0,这对我来说没有任何区别。

调试应用程序的 x86 版本没有问题。

编辑:为了回答第一个答案中提出的问题,我在目标(ARM)上使用gdb,即没有cross-gdb。我也没有剥离libpthread.so.0(/lib/libpthread-2.9.so:ELF 32位LSB共享对象,ARM,版本1(SYSV),动态链接(使用共享库),用于GNU/Linux 2.6.16,未剥离)。glibc 保留在 2.9 版本,更新涉及重新编译整个 Linux 映像

EDIT2:删除/lib/libthread-db* 允许调试(随之而来的警告,显然某些功能将不起作用)

编辑3:使用设置调试libthread-db 1,我得到:

Starting program: /home/root/app
Trying host libthread_db library: libthread_db.so.1.
Host libthread_db.so.1 resolved to: /lib/libthread_db.so.1.
td_ta_new failed: application not linked with libthread
thread_db_load_search returning 0
Trying host libthread_db library: libthread_db.so.1.
Host libthread_db.so.1 resolved to: /lib/libthread_db.so.1.
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/libthread_db.so.1".
warning: Unable to set global thread event mask: generic error
Warning: find_new_threads_once: find_new_threads_callback: cannot get thread info: generic error
Found 0 new threads in iteration 0.
Warning: find_new_threads_once: find_new_threads_callback: cannot get thread info: generic error
Found 0 new threads in iteration 1.
Warning: find_new_threads_once: find_new_threads_callback: cannot get thread info: generic error
Found 0 new threads in iteration 2.
Warning: find_new_threads_once: find_new_threads_callback: cannot get thread info: generic error
Found 0 new threads in iteration 3.
thread_db_load_search returning 1
Warning: find_new_threads_once: find_new_threads_callback: cannot get thread info: generic error
Found 0 new threads in iteration 0.
Cannot find new threads: generic error
(gdb) Write failed: Broken pipe

此错误有两个常见原因:

  1. libpthread.so.0libthread_db.so.1不匹配
  2. 你已经剥离了libpthread.so.0

您的信息并不完全清楚:

  1. 是否使用跨 GDB 调试从 x86 主机在 ARM 上运行的应用程序?
  2. 除了更新内核等之外,您是否更新(或重建)glibc

如果你剥离了libpthread.so.0,那么不要那样做 - libthread_db需要它被剥离。

如果要交叉调试,请确保在主机上重新生成libthread_db.so.1以匹配目标上的glibc

更新:

不交叉调试
没有剥离 libpthread

因此,您的 GDB 或glibc中的某些内容似乎已损坏。你可以试着看看那是什么

  1. 将取出的libthread_db放回原处,以及
  2. (gdb) set debug libthread-db 1
  3. (gdb) run

更新 2:

警告:无法设置全局线程事件掩码:一般错误

这意味着 GDB 能够在 libthread_db 中查找td_ta_set_event函数并调用它,但该函数返回了错误。发生这种情况的一种方式是,如果 GDB 无法在 libpthread.so.0 中找到__nptl_threads_events功能。此命令产生什么:

nm /lib/libpthread.so.0 | grep __nptl_threads_events

如果该命令产生输出,例如:

000000000021c294 b __nptl_threads_events

那么我不确定还有什么失败。您可能需要调试 GDB 本身才能弄清楚发生了什么。

另一方面,如果上面的grep没有产生输出,那么这是你的工具链的问题:你必须弄清楚为什么该变量没有出现在你重建的libpthread.so.0中。

相关内容

最新更新