c - 有什么作用??在 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 ?? ()
??
回溯中有什么?我该如何解决它们?
解决方案
这些??
通常是显示函数名称的地方。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
在程序崩溃之前尝试运行该命令。
推荐阅读
- javascript - 如何使用javascript和css边距垂直和水平居中div?
- json - 使用嵌套对象解析 json 文件
- asp.net - 主属性不是在 aspx 设计器中自动生成导致运行时错误
- master-theorem - 主定理 f(n) = cn^k
- .net-core - openCover 报告意外的低覆盖率
- python - 在 Django 中替换视图类的视图函数
- c++ - 关于使用声明 c++ 的规则
- java - 同时从不同线程调用类或结构的不同方法是否线程安全?(C++ 和 Java)
- html - 当右侧元素是居中对齐的多行文本时,如何删除并排元素之间的额外空间?
- firefox - Firefox 无法下载文件