什么是??在gdb backtrace中意味着以及如何获取实际的堆栈帧?

md.*_*mal 3 c linux debugging gdb

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

这是代码:

int main()
{
    return 1/0;
}
Run Code Online (Sandbox Code Playgroud)

这是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 ?? ()
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*lli 7

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

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

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

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

假设以下情况program.c

int main(void) { return 1/0; }
Run Code Online (Sandbox Code Playgroud)

这应该有效:

int main(void) { return 1/0; }
Run Code Online (Sandbox Code Playgroud)

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