Linux堆栈跟踪转储

时间:2012-06-15 18:09:40

标签: c++ g++

我正在编写一个程序,在执行过程中它会崩溃并打印这个堆栈跟踪:

pure virtual method called
terminate called without an active exception
0  prog            0x08f04a98
1  prog            0x08f05147
2                  0xb7802400 __kernel_sigreturn + 0
3  libc.so.6       0xb758fbb2 abort + 386
4  libstdc++.so.6  0xb778653f __gnu_cxx::__verbose_terminate_handler() + 335
5  libstdc++.so.6  0xb7784405
6  libstdc++.so.6  0xb7784442
7  libstdc++.so.6  0xb77850f5
8  prog            0x08f2cb1f proj::raw_ostream::write(char const*, unsigned int) + 159
9  prog            0x081df8fe
10 prog            0x081d079b
11 prog            0x08e8ac02 proj::Value::~Value() + 130
12 prog            0x082749ad
13 prog            0x08e1cd62 proj::Tiny::~Tiny() + 178
14 prog            0x08e1fc86 proj::Alloca::~Alloca() + 38
15 prog            0x08e252ac proj::Alloca::~Alloca() + 44
16 prog            0x088e9bbc
17 prog            0x088e9b64
18 prog            0x08d3782e
19 prog            0x08d36a46
20 prog            0x08d34e95 proj::Medium::~Medium() + 485
21 prog            0x08d34c9c proj::Medium::~Medium() + 44
22 prog            0x08d3753c
23 prog            0x08d36da4
24 prog            0x08d350ed proj::Medium::eraseFromParent() + 109
25 prog            0x08dc780d proj::Big::dropAllReferences() + 253
26 prog            0x08e530b9 proj::Module::dropAllReferences() + 137
27 prog            0x08e52ea0 proj::Module::~Module() + 64
28 prog            0x08c602cb proj::Engine::~Engine() + 155
29 prog            0x08743e00 proj::Controller::~Controller() + 192
30 prog            0x08743d2c proj::Controller::~Controller() + 44
31 prog            0x081cdee9
32 libc.so.6       0xb75912df
33 libc.so.6       0xb759134f
34 libc.so.6       0xb7578cae __libc_start_main + 238
35 prog            0x081cc501

第三栏的地址是什么?我猜他们是功能地址,但是他们呢?似乎在某个点上调用了一些虚函数,我怎么知道调用了什么虚函数?

3 个答案:

答案 0 :(得分:1)

第三列是记录在堆栈上的程序计数器,因此它将是一个代码地址。

你需要看一下你是否在析构函数中调用纯虚函数;最有可能proj::Value::~Value()正在调用proj::Value中的纯虚拟虚拟内容。

答案 1 :(得分:1)

是的,它们是函数地址。如果您具有该转储的相应核心文件,并且已使用调试符号进行编译,则可以在gdb中加载核心和可执行文件,并使用命令list *<address>。它将显示与该地址对应的代码行。

如果没有看到任何代码,我猜write raw_ostream上的{{1}}是虚拟方法。

答案 2 :(得分:0)

第三列是在函数堆栈上执行的实际内存地址(应该等于第四列,它给出了从命名函数开头的偏移量)。

显示函数堆栈的成长:前面显示的行嵌套在调用堆栈的更深处。换句话说:您的main位于列表底部

附近

虚拟函数从proj::Value::~Value()调用,调用proj::raw_ostream::write(char const*, unsigned int),导致异常