2012-06-15 58 views
0

我編碼的程序,並在執行過程中某些時候它崩潰並打印此堆棧跟蹤:的Linux堆棧跟蹤轉儲

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 

什麼是第三列的地址?我猜他們是功能地址,但是他們?似乎某個虛函數正在某個點被調用,我怎麼知道被調用的虛函數?

+0

與調試信息('克-g'標誌編譯程序++ ),您將從堆棧跟蹤中獲得更準確的信息。 –

回答

1

第三列是記錄在堆棧上的程序計數器,因此它將是一個代碼地址。

您需要看看是否在析構函數中調用純虛函數;最有可能的是proj::Value::~Value()正在調用一個純粹的proj::Value虛擬。

1

是的,它們是函數地址。如果您具有該轉儲的相應核心文件,並且已使用調試符號進行編譯,則可以在gdb中加載核心和可執行文件,並使用命令list *<address>。它會顯示與該地址對應的代碼行。

沒有看到任何代碼,我猜想writeraw_ostream是一個虛擬的方法。

0

第三列是在函數堆棧上執行的實際內存地址(應該等於第四列,它給出了從指定函數開始的偏移量)。

函數堆棧顯示成長:前面顯示的行嵌套在調用堆棧的更深處。在其他的方式:你main靠近列表的底部

虛函數被稱爲proj::Value::~Value(),要求proj::raw_ostream::write(char const*, unsigned int),從而導致該異常