我想在我的自定义 Linux 发行版上调试 pthreads,但我缺少一些东西。我的主机是 Ubuntu 12.04,我的目标是使用 crosstool-NG 交叉编译器工具集构建的 i486 定制嵌入式 Linux,操作系统的其余部分是使用 Buildroot 制作的。
我将列出事实:
e.g.
$./gdb -n -ex "thread apply all backtrace" ./a.out --pid 716
dlopen failed on 'libthread_db.so.1' - /lib/libthread_db.so.1: undefined symbol: ps_lgetfpregs
GDB will not be able to debug pthreads.
GNU gdb 6.8
我不认为 ps_lgetfpregs 是一个问题,因为this http://permalink.gmane.org/gmane.linux.debian.devel.glibc/4409.
我的 crosstool 构建创建了 libthread_db.so 文件,并将其放在目标上。
我的 crosstool 构建为我的目标创建了 gdb,因此它应该链接到我在目标上运行的相同库。
如果我在主机上针对我的测试应用程序运行 gdb,我会得到每个正在运行的线程的回溯。
我怀疑 Breakpad 的问题与 GDB 的问题有关,但我无法证实这一点。唯一的共同点是缺乏多线程调试。
我的主机和目标之间存在一些关键差异,这使我无法在目标上调试 pthread。
有谁知道它是什么?
EDIT:
丹尼斯·德米特里延科 http://e2e.ti.com/support/embedded/linux/f/354/t/52720.aspxTI 说:
通常,GDB 不是很挑剔,你可以混合搭配不同的
gdb 和 gdbserver 的版本。但是,不幸的是,如果您需要
调试多线程应用程序,有一些特定的依赖项
蜜蜂...
例如,如果您没有这样做,这是您可能会看到的消息之一
正确构建 GDB 以支持线程:
dlopen 在“libthread_db.so.1”上失败 - /lib/libthread_db.so.1:
未定义符号:ps_lgetfpregs GDB 将无法调试
线程。
请注意,此错误与我收到的错误相同,但他没有详细介绍如何“正确”构建 GDB。
and the GDB FAQ http://sourceware.org/gdb/wiki/FAQ says:
(Q) 除了发生崩溃的线程之外,GDB 没有看到任何线程;
或者当我设置断点时 SIGTRAP 会终止我的程序。
(一)经常这样
发生在 Linux 上,尤其是嵌入式目标上。常见的有两种
原因:
GDB本身就是这样的
不知道如何解码 glibc 维护的“线程控制块”和
被认为是 glibc 私有实现细节。它用
libthread_db.so.1(glibc 的一部分)来帮助它做到这一点。所以,
libthread_db.so.1 和 libpthread.so.0 的版本必须匹配
编译标志。另外,libthread_db.so.1需要一定的
libpthread.so.0 中存在的非全局符号。
解决办法:使用
strip --strip-debug libpthread.so.0 而不是 strip libpthread.so.0。
我尝试了未剥离的 libpthread.so.0 但没有什么区别。我将调查 pthread 和 thread_db 之间的任何不匹配。