GDB显示无堆栈

anu*_*g86 5 c++ gdb

我正在尝试运行测试程序,以查看gdb(backtrace)如何显示调用堆栈。我有以下程序

#include<iostream>
#include<assert.h>

void fun2()
{
        assert(0);
}
void fun1()
{
        fun2();
}
int main()
{
        fun1();
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我执行以下操作:

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

我期望它将呼叫堆栈显示为:

fun2
fun1
main
Run Code Online (Sandbox Code Playgroud)

编辑:我编辑了代码并编译为 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;
}
Run Code Online (Sandbox Code Playgroud)

这次的汇编代码向我展示了fun1,fun2(assert),main的单独代码。但是我仍然看到gdb中没有堆栈

Bat*_*eba 1

gcc 没有理由不优化你的程序

int main()
{
    assert(0);
}
Run Code Online (Sandbox Code Playgroud)

要消除所有疑问,请检查生成的程序集。

  • 出于调试目的,我希望“-O0”能够防止这种情况发生。 (4认同)
  • 即使 GCC 可以将程序优化为仅 main,GDB *仍然*会显示核心除“无堆栈”之外的其他内容。对于缩减后的程序,“main”和“raise”可能位于堆栈上。 (3认同)