2011-11-04 83 views
0

我得回溯在C++函數,並將其存儲到一個字符串,如下所示:在C++中使用backtrace()函數時出錯?

string myFunction() 
{ 
    void *array[5002]; 
    // get void*'s for all entries on the stack 
    size_t size = backtrace(array, 5000); 
    char** trace = backtrace_symbols(array, size); 
    string stackTrace; 
    for(size_t index=0; index<size; ++index) 
    { 
     stackTrace += trace[index]; 
    } 
return stackTrace; 
} 

上面使用的代碼我收到內存故障。 回溯與上述錯誤的GDB是如下

??() from /lib64/libgcc_s.so.1 
0x000000359be08934 in _Unwind_Backtrace() from /lib64/libgcc_s.so.1 
0x00000035976e6358 in backtrace() from /lib64/libc.so.6 
0x00002aaaab7afaec in (anonymous namespace)::myFunction() at fileName.cpp 

任何sugestion解決呢? 感謝Advace。

回答

0

您需要添加-rdynamic編譯器標誌GCC/G ++:

g++ -rdynamic -Wall -o file.bin file.cpp 
+0

是的,這應該有所幫助。 –

+0

我試過使用上面的標誌,但我得到了同樣的錯誤。還有一件事是,在上面的問題中給出的錯誤只有在代碼被調試構建時,其他方式才能順利運行。 – BSalunke

0

在致電backtrace之前,我會用memset(array, 0, sizeof (array))清除array。我會讓它更小一點:5000幀真的很深。

backtrace可能不適用於編碼爲優化標記爲gcc的代碼(至少在32位系統上)。

+0

謝謝巴西萊,我試着用memset(),但它不能去除memeory故障。任何其他oprion爲此? – BSalunke

+0

數組可以直接初始化,不需要調用memset:void * array [5002] = {};'。 – avakar