linux – 调试pthreads需要什么?
我想在我的自定义
Linux发行版上调试pthreads,但我遗漏了一些东西.我的主机是Ubuntu 12.04,我的目标是使用crosstool-NG交叉编译工具集构建的i486自定义嵌入式Linux,其余操作系统由Buildroot制作.
我会列出事实: >我可以在目标上运行多线程应用程序 例如 $./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 由于this,我认为ps_lgetfpregs不是问题. >我的crosstool构建创建了libthread_db.so文件,并将其放在目标上. 我怀疑Breakpad的问题与GDB的问题有关,但我无法证实这一点.唯一的共同点是缺少多线程调试. 我的主机和目标之间存在一些重要的区别,使我无法在目标上调试pthread. 有谁知道它是什么? 编辑: TI的Denys Dmytriyenko说:
请注意,此错误与我获得的错误相同,但他没有详细介绍如何“正确”构建GDB. 并且GDB FAQ说:
我尝试了一个非剥离的libpthread.so.0,但它并没有什么区别.我将调查pthread和thread_db之间的任何不匹配. 解决方法
这个:
dlopen failed on 'libthread_db.so.1' - /lib/libthread_db.so.1: undefined symbol: ps_lgetfpregs GDB will not be able to debug pthreads. 表示libthread_db.so.1库无法在gdb中找到符号ps_lgetfpregs. 为什么? 因为我使用Crosstoolg-NG使用“构建静态本机gdb”选项构建gdb,这会将-static选项添加到gcc. 本机gdb使用-rdynamic选项构建,这将使用所有符号填充ELF文件中的.dynsym符号表,甚至是未使用的符号. libread_db使用此符号表从gdb中查找ps_lgetfpregs. 但是-static从ELF文件中剥离了.dynsym表. 此时有两种选择: >如果要调试线程,请不要构建静态本机gdb. 编辑: 顺便说一下,这并不能解释为什么Breakpad无法在我的目标上调试多线程应用程序. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |