gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:09:19 35 4
gpt4 key购买 nike

我正在尝试学习如何在核心转储上使用 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 ?? ()

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

最佳答案

那些 ?? 通常是显示函数名称的地方。 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

关于c - 什么?在 gdb backtrace 中意味着以及如何获得实际的堆栈帧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60098344/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com