我有一个多线程C ++程序,在极少数情况下会出现死锁。这个问题难以重现,我只能在远程机器上重现它。 我想用来解决这个问题的方法是
我在远程计算机上没有gdb,也无法在其上安装任何内容。 问题是当我调试核心转储(从远程计算机上的死锁或正常运行的进程获得)时,大多数线程的反向跟踪仅显示:
(gdb) bt #0 pthread_cond_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:261 #1 0x0000000000000000 in ?? ()
我使用的是静态链接的二进制文件,它使用“-g -O1”选项编译。 当我在本地机器上中止同一个二进制文件的进程时,gdb可以从核心转储中提取整个堆栈,并且没有这样的问题(但是我无法重现死锁)。 我的远程计算机是SLES,我的本地计算机是ubuntu。
有什么想法吗?
编辑:
发现其他人有同样的问题,但仍然没有解决方案: http://groups.google.com/group/google-coredumper/browse_thread/thread/2ca9bcf9465d1050 (我没有使用谷歌coredumper,但似乎谷歌coredumper失败了同样的错误,这表明也许问题是SLES 11)
答案 0 :(得分:3)
请注意,您也可以使用gcore创建核心文件而不会中止。您是否尝试在远程主机上运行pstack(假设已安装)以查看是否可以通过这种方式获得回溯?
否则,如果应用程序使用的共享对象在本地主机和远程主机上不同,gdb将无法正确匹配内存偏移量,并且回溯可能会让所有人感到困惑。如果您能够将所有相关的.so
文件从远程主机复制到本地的某个位置,我相信您可以指示gdb从它们读取而不是正常安装的版本。
答案 1 :(得分:1)
你的glibc的年龄是多少?你可能错过了这个:
commit ad2be8527ac0f19f129fc4519d823cbe48239c78
Author: Ulrich Drepper <drepper@redhat.com>
Date: Sun Apr 13 08:36:19 2003 +0000
Update.
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S: Add unwind info.
* sysdeps/unix/sysv/linux/x86_64/pthread_cond_timedwait.S: Likewise.
* sysdeps/unix/sysv/linux/i386/i486/pthread_cond_wait.S: Likewise.