【问题标题】:Can not get any information from gdb backtrace无法从 gdb 回溯中获取任何信息
【发布时间】:2011-08-09 07:16:45
【问题描述】:

我有一个在 linux 64 位系统下运行的发行版服务器进程。它崩溃了并留下了一个核心转储文件。我使用 gdb 来调试它:

gdb svr 核心转储文件

并得到以下回溯:

(gdb) where
#0  0x0000000000432691 in ?? ()
#1  0x00002b07655a50cc in ?? ()
#2  0x00002b07655a50c4 in ?? ()
#3  0x00007fff9fade920 in ?? ()
#4  0x0000000000439db3 in ?? ()
#5  0x00007fff9fade910 in ?? ()
#6  0x00007fff9fade910 in ?? ()
#7  0x00007fff9fade8e0 in ?? ()
#8  0x00000000004663e2 in ?? ()
#9  0x00007fff9fade910 in ?? ()
#10 0x00007fff9fade910 in ?? ()
#11 0x00007fff9fade930 in ?? ()
#12 0x0000000000605108 in ?? ()
#13 0x00002b07655a274c in ?? ()
#14 0x0000000000ebc678 in ?? ()
#15 0x169f49f100000001 in ?? ()
#16 0x00000000021dc6c0 in ?? ()
#17 0x00002b07655a284c in ?? ()
#18 0x00002b07655a27dc in ?? ()
#19 0x00007fff9fade960 in ?? ()
#20 0x000000000043a03b in ?? ()
#21 0x00007fff9fade960 in ?? ()
#22 0x0000000000994d02 in ?? ()
#23 0x00000000000ecd57 in ?? ()
#24 0x00002b07655a274c in ?? ()
#25 0x00002b07655a274c in ?? ()
#26 0x00002b07655a27dc in ?? ()
#27 0x00007fff9fade980 in ?? ()
#28 0x000000000060a5eb in ?? ()
#29 0x000000009fadeb50 in ?? ()
#30 0x00002b07655a274c in ?? ()
#31 0x00007fff9fade9d0 in ?? ()
#32 0x000000000060a8f0 in ?? ()
#33 0x00007fff9fadeb50 in ?? ()
#34 0x00007fff9fadea10 in ?? ()
#35 0x00002b07655a274c in ?? ()
#36 0x00007fff9fadea10 in ?? ()
#37 0x000000009fade9d0 in ?? ()
#38 0x00007fff9fadeb58 in ?? ()
#39 0x0000000000000000 in ?? ()

addr2line 无法分析地址信息,问题出在哪里,如何找到导致coredump 的根本原因?

谢谢!

【问题讨论】:

  • 程序是用-g标志编译的吗?确保你没有剥离你的可执行文件。

标签: debugging gdb backtrace


【解决方案1】:

您是否在生成核心转储的机器上运行 GDB?

为了让 GDB 正确重建崩溃堆栈跟踪,它必须能够访问在崩溃时使用的准确二进制文件(否则你会得到垃圾)。

实现这一目标的最简单方法是分析生产它的机器上的核心。如果这不可行,您必须将所有共享库复制到例如/tmp/solib-on-server/(保留路径,例如/lib/libc.so.6 进入/tmp/solib-on-server/lib/libc.so.6),然后在加载核心之前使用GDB set solib-absolute-prefix /tmp/solib-on-server 命令。例如

gdb -ex 'set solib-absolute-prefix /tmp/solib-on-server' \
    -ex 'core /path/to/core' /path/to/executable

【讨论】:

    【解决方案2】:

    没有调试符号很难调试程序。当您使用的是应用程序的发布版本时,核心转储将不包含任何调试信息。

    我不确定,但是如果您可以将堆栈跟踪与应用程序的“.map”文件相关联,那么您可能会有所收获。如果我处于你的位置,我会使用调试符号(-g 编译器标志)重新编译应用程序,然后继续调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      • 2014-12-22
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多