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

问题描述:

我正在使用Eclipse开发和远程调试ARM处理器的某些软件。不幸的是我写的软件是多线程的,我无法调试它。如果我把一个破发点中的线程代码,我得到以下信息:使用GDB远程调试多线程C程序

Child terminated with signal = 5

Child terminated with signal = 0x5

GDBserver exiting

做相当多的谷歌搜索后,我发现了一个“解决方案“这提出了利用这一点:

strip --strip-debug libpthread.so.0

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

我真的很感激你的帮助,让这个想通了!

谢谢!

+0

我不确定这是否与多线程有关,因为通常用gdb调试它通常工作正常。你怎么称呼strip命令。 cc1.exe和gcc.exe前缀很奇怪。我会在bash中调用一个正常的命令。 – dmeister 2011-06-10 13:50:55

+0

@dmeister这是我找到“解决方案”的网站[http://sourceware.org/bugzilla/show_bug.cgi?id=8963](http://sourceware.org/bugzilla/show_bug.cgi?id= 8963) 我调用它的方式是在eclipse中的C builder的其他标志部分中添加了以下内容:调用为: 'arm-none-linux-gnueabi-gcc.exe -O0 -g3 -Wall -c -fmessage-length = 0 strip --strip-debug libpthread.so.0' – avivas 2011-06-10 14:01:45

+0

你可以尝试它作为一个单独的调用,而不是将其添加到构建器中。请注意,这可能需要root权限,因为它会更改系统文件(lbpthread.so.0)。 – dmeister 2011-06-10 14:41:34

首先,此(和随后的)错误(或多个):

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

通过加入strip --strip-debug等,以在GCC命令行引起的。那就是明显是虚假的事情,而且根本就不是你的谷歌搜索建议。 (您可能要清理你的问题,除去这些错误的引用。他们什么都没有做与你的问题)

它所(或应该)建议,使用strip --strip-debug libpthread.so.0代替使用strip libpthread.so.0

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

它可以被除去调试符号(这就是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(对于目标)的版本匹配是至关重要的,它们都应该提供d由您的工具链供应商提供。

你的问题很可能是GDB根本找不到libthread_db.so.0,或者它找到了错误的一个。

+0

感谢您提供此信息,当运行命令'nm /path/to/target/libpthread.so.0 | grep nptl_version'我的目标是:'00011468 r nptl_version' 我尝试从命令行运行gdb,但它不打印'using/path/libpthread_db_so.0',它只打印以下内容: 'Process /创建root/tempSensor; PID = 988 侦听端口2345 远程调试从主机192.168.34.37' 和主机打印: '(GDB)使用192.168.34.100:2345 0x00008110目标远程192.168.34.100:2345 远程调试?? () (gdb)' – avivas 2011-06-13 12:55:33

+0

如果我现在从Eclipse运行它,我得到以下错误:'gdb:初始化thread_db库时出错' – avivas 2011-06-13 13:01:59