使用GDB远程调试多线程C程序

时间:2011-06-10 13:46:48

标签: c multithreading eclipse gdb gdbserver

我正在使用Eclipse开发和远程调试ARM处理器的某些软件。不幸的是,我写的软件是多线程的,我无法调试它。如果我在线程代码中放置一个断点,我会收到以下消息:

Child terminated with signal = 5

Child terminated with signal = 0x5

GDBserver exiting

在做了相当多的谷歌搜索之后,我找到了一个建议使用它的“解决方案”:

strip --strip-debug libpthread.so.0

不幸的是,我仍然收到了终止错误。

我非常感谢你帮助我解决这个问题!

谢谢!

1 个答案:

答案 0 :(得分:1)

首先,这个(以及随后的)错误:

cc1.exe: error: unrecognized command line option "-fstrip-debug"

是通过向GCC命令行添加strip --strip-debug等引起的。这显然是虚假的事情,而不是你的谷歌搜索建议。 (您可能希望清理问题以删除对这些错误的引用;它们与您的问题无关。)

做了(或应该有)建议的内容,使用strip --strip-debug libpthread.so.0 代替使用strip libpthread.so.0

这是因为如果你的libpthread.so.0被完全剥离,GDB就无法使用线程

它可以被剥离调试符号(这是strip --strip-debug libpthread.so.0所做的),但剥离所有符号(这是strip libpthread.so.0所做的)是一个坏主意(TM)。

由于您(显然)不是自己构建libpthread.so.0,因此您也不需要删除它。

以下命令不应报告no symbols,并且实际上应打印匹配的nptl_version(作为已定义的符号):

nm /path/to/target/libpthread.so.0 | grep nptl_version

假设到目前为止一切都很好,我们现在可以诊断您的问题,除了...您没有提供足够的信息;-(特别是,当您运行GDB时,它应该打印类似using /path/to/libthread_db.so.0的内容。您可能必须在Eclipse中搜索GDB控制台,或者您可能希望从命令行运行GDB,因此您可以准确地看到它打印的内容。

libthread_db.so.0(对于主机)的版本与lipthread.so.0(对于目标)的版本匹配至关重要。它们都应该由您的工具链供应商提供。

您的问题很可能是GDB根本找不到libthread_db.so.0,或者找不到错误。