c – GDB无法显示堆栈并显示“#1 0x0000000000000000 ?? ()”

我有一个多线程C程序,在一些罕见的情况下会死锁.这个问题难以重现,我只能在远程机器上重现它.
我想用来解决这个问题的方法是

>运行程序
>等待死锁
>向其发送中止信号以生成核心转储
>将转储复制回本地计算机
>使用gdb进行调试

我在远程计算机上没有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)

解决方法:

请注意,您还可以使用gcore创建核心文件而不会中止.您是否尝试在远程主机上运行pstack(假设已安装)以查看是否可以通过这种方式获得回溯?

否则,如果应用程序使用的共享对象在本地主机和远程主机上不同,gdb将无法正确匹配内存偏移量,并且回溯可能会让所有人感到困惑.如果您能够将所有相关的.so文件从远程主机复制到本地的某个位置,我相信您可以指示gdb从它们读取而不是正常安装的版本.

编辑:尝试在您的构建计算机上运行pstack,看看它是否可以获取堆栈.

上一篇:替代Linux上的backtrace(),可以找到静态函数的符号


下一篇:Emacs之multi-occur(替代的正则)