我有一个多线程 C++ 程序,在极少数情况下会死锁。这个问题很难重现,我只能在远程机器上重现它。我想用来解决这个问题的方法是
- 运行程序
- 等待死锁
- 向其发送中止信号以生成核心转储
- 将转储复制回我的本地计算机
- 使用 gdb 调试它
我在远程机器上没有 gdb,也无法在上面安装任何东西。问题是当我调试核心转储(从远程机器上的死锁或正常运行的进程获得)时,大多数线程的回溯只显示:
(gdb) BT #0 pthread_cond_wait () at ../nptl/sysdeps/unix/sysv/linux/x86_64/pthread_cond_wait.S:261 #1 0x0000000000000000 在 ?? ()
我正在使用使用“-g -O1”选项编译的静态链接二进制文件。当我在本地机器上中止相同二进制文件的进程时,gdb 可以从核心转储中提取整个堆栈,并且没有这样的问题(但是我无法重现死锁)。我的远程机器是 SLES,我的本地机器是 ubuntu。
任何的想法?
编辑:
发现其他人有同样的问题,但仍然没有解决方案: http ://groups.google.com/group/google-coredumper/browse_thread/thread/2ca9bcf9465d1050 (我没有使用google coredumper,但似乎google coredumper失败了有同样的错误,这表明问题可能出在 SLES 11 上)