gdb:无法找到新线程:系统更新后的一般错误

时间:2012-05-31 20:13:32

标签: gdb pthreads arm

我在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,即没有交叉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 *允许调试(带有后续警告,显然某些功能不起作用)

EDIT3:使用set debug 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 个答案:

答案 0 :(得分:6)

此错误有两个常见原因:

  1. libpthread.so.0libthread_db.so.1
  2. 之间存在不匹配
  3. 您已剥离libpthread.so.0
  4. 您的信息并不完全清楚:

    1. 您是否正在使用跨GDB从x86主机调试在ARM上运行的应用程序?
    2. 除了更新内核等之外,您还更新(或重建)glibc
    3. 如果您剥离了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
      4. 更新2:

          

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

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

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

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

        000000000021c294 b __nptl_threads_events
        

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

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