GDB显示没有堆栈。

6

我正在尝试运行一个测试程序,以查看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中仍然看不到堆栈。

尝试禁用优化(添加标志“-O0”)并重试? - Some programmer dude
你确定 core.28149 是为 out 二进制文件生成的吗?file core.28149 的输出是什么? - ks1322
在加载 core dump 时,您能否发布整个 gdb 会话? - ks1322
1
我注意到的一件事是,gdb说Reading symbols from /somepath here../tmp/out...done. "/somepath here/core.30117" is not a core dump: File format not recognized。这很奇怪,因为那确实是core dump,因为在程序崩溃后那是唯一生成的文件。 - anurag86
file /somepath here/core.30117 这个 shell 命令输出的类型是什么? - Mark Plotnick
显示剩余5条评论
4个回答

3

从/somepath here../tmp/out读取符号...完成。"/somepath here/core.30117"不是一个核心转储文件:无法识别的文件格式

您的核心转储文件似乎已损坏。实际上,它没有被gdb加载,因此键入bt没有任何效果。

尝试检查它,这些命令应该为您提供有关核心转储文件的一些信息:

  • file core.28149
  • strings core.28149

file core.28149 的输出为 core.28149: empty。而 strings 命令没有任何输出。 - anurag86
这意味着 core.28149 没有数据,请再次检查您的限制。 - ks1322

1

gcc 没有理由不对您的程序进行优化

int main()
{
    assert(0);
}

为了消除所有的疑虑,请检查生成的汇编代码。

4
为了调试目的,我希望-O0能够防止这种情况发生。 - Lightness Races in Orbit
3
即使GCC仅优化到主函数(main),GDB依然会显示核心(core)中除“无堆栈”之外的其他内容。对于简化后的程序,主函数(main)和raise函数可能仍在堆栈上。 - Employed Russian
-O0仍然没有帮助。它仍然显示无堆栈。汇编还向我展示了不同的函数。仍然不知道为什么它不显示堆栈跟踪。 - anurag86

0
在我的情况下,当我尝试附加到进程时,GDB显示“没有堆栈”,这是由于权限问题。为了检查是否是这种情况,我使用了“sudo”。
sudo gdb -p <PID>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接