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

Sha*_*oya 5 c++ linux gdb dump backtrace

我有一个多线程 C++ 程序,在极少数情况下会死锁。这个问题很难重现,我只能在远程机器上重现它。我想用来解决这个问题的方法是

  1. 运行程序
  2. 等待僵局
  3. 向它发送中止信号以生成核心转储
  4. 将转储复制回我的本地机器
  5. 使用 gdb 进行调试

我在远程机器上没有 gdb,无法在其上安装任何东西。问题是当我调试核心转储(从远程机器上的死锁或正常运行的进程获得)时,大多数线程的回溯仅显示:

(gdb) bt
#0 pthread_cond_wait () 在 ../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)

Mar*_*k B 3

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

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

编辑:尝试在构建机器上运行 pstack 并查看它是否可以拾取堆栈。