首页 > 解决方案 > 有什么作用??在 gdb 回溯中的意思以及如何获取实际的堆栈帧?

问题描述

我试图学习如何gdb在核心转储上使用。

这是代码:

int main()
{
    return 1/0;
}

这是gdb我运行时的输出gdb a.out core

warning: exec file is newer than core file.
[New LWP 3121]
Core was generated by `./crash'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0  0x00000000004004fc in ?? ()
(gdb) bt
#0  0x00000000004004fc in ?? ()
#1  0x0000000000400500 in ?? ()
#2  0x00007f6ea0945b97 in ?? ()
#3  0x0000000000000000 in ?? ()

??回溯中有什么?我该如何解决它们?

标签: clinuxdebugginggdb

解决方案


这些??通常是显示函数名称的地方。GDB 不知道这些函数的名称,因此显示??.

现在,为什么会这样?要看。默认情况下,GCC 编译包括符号(例如函数名称和类似名称)。很可能您正在使用剥离版本,其中符号已被删除,或者只是使用错误的文件。

正如@zwol所建议的那样,您看到的这条线warning: exec file is newer than core file表明正在发生其他事情,而您没有在问题中显示。您正在处理core由崩溃的可执行文件生成的转储文件,该文件已过时。

我建议您从头开始重新编译程序,并确保您使用 GDB 打开正确的文件。core首先通过使新程序崩溃来生成新的转储,然后在 GDB 中打开它。

假设以下program.c

int main(void) { return 1/0; }

这应该有效:

$ rm -f core
$ gcc program.c -o program
$ ./program
Floating point exception (core dumped)

$ gdb program core
Reading symbols from program...(no debugging symbols found)...done.
[New LWP 11896]
Core was generated by `./program'.
Program terminated with signal SIGFPE, Arithmetic exception.
#0  0x000055d24a4cd790 in main ()
(gdb) bt
#0  0x000055d24a4cd790 in main ()
(gdb)

注意:如果您在运行该进程时没有看到(core dumped),则表示未生成核心转储(这会让您使用旧转储)。如果您使用的是 Bash,请ulimit -c unlimited在程序崩溃之前尝试运行该命令。


推荐阅读