我正在尝试运行一个测试程序来查看 gdb(回溯)如何显示调用堆栈。我有以下程序
#include<iostream>
#include<assert.h>
void fun2()
{
assert(0);
}
void fun1()
{
fun2();
}
int main()
{
fun1();
return 0;
}
我做了以下事情:
g++ -g dump.cpp -o out
./out
out: dump.cpp:16: void fun2(): Assertion `0' failed.
Abort (core dumped)
gdb out core.28149
(gdb) bt
No stack. //Why does it show no stack here
我期望它将调用堆栈显示为:
fun2
fun1
main
编辑: 我编辑了代码并编译为
g++ -g -O0 dump.cpp -o out
但我仍然有没有堆栈
void fun2(int num)
{
int h=23;
if(h*num>100)
{
assert(0);
}
else
{
cout<<"Hello";
}
}
void fun1(int num)
{
{
fun2(num);
}
}
int main()
{
int num;
cin>>num;
fun1(num);
return 0;
}
这次汇编代码向我展示了 fun1、fun2(assert)、main 的单独代码。但我仍然在 gdb 中看到 No Stack
从/somepath这里读取符号../tmp/out...完成。 “/某条路径 这里/core.30117”不是核心转储:文件格式无法识别
您的核心转储已损坏。实际上它不是由 gdb 加载的,所以输入
bt
没有效果。
尝试检查它,这些命令应该为您提供一些有关核心转储的信息:
file core.28149
strings core.28149
gcc 没有理由不优化你的程序
int main()
{
assert(0);
}
要消除所有疑问,请检查生成的程序集。
尝试如下:
$ clang++ -g -O0 -o dump dump.cpp
$ ./dump
100
Assertion failed: (0), function fun2, file dump.cpp, line 9.
Abort trap (core dumped)
$ gdb --core dump.core
. . .
Core was generated by `dump'.
Program terminated with signal SIGABRT, Aborted.
#0 0x000000080149f6ca in ?? ()
(gdb) file dump
Reading symbols from dump...done.
(gdb) set solib-search-path "/lib:<path>/llvm/lib"
(gdb) bt
#0 0x000000080149f6ca in thr_kill () from /lib/libc.so.7
#1 0x0000000801574149 in abort () from /lib/libc.so.7
#2 0x0000000801556011 in __assert () from /lib/libc.so.7
#3 0x000000000040130a in fun2 (num=100) at dump.cpp:10
#4 0x0000000000401343 in fun1 (num=100) at dump.cpp:20
#5 0x000000000040137e in main () at dump.cpp:27
就我而言,当我尝试附加到进程时,由于权限问题,gdb 显示
No stack.
。为了检查是否是这种情况,我使用了sudo
:
sudo gdb -p <PID>