我想在我的(C++)程序執行的某個位置獲得回溯。stacktrace和命名空間中的函數
因爲我正在使用backtrace和backtrace_symbols。沿着這條線:
std::string stacktrace(unsigned int frames_to_skip)
{
std::string str;
void* stack_addrs[50];
int trace_size = backtrace(stack_addrs, 50);
char** stack_strings = backtrace_symbols(stack_addrs, trace_size);
str += "[bt] backtrace:\n";
// skip frames_to_skip stack frames
for(int i = frames_to_skip; i < trace_size; ++i)
{
char tmp[4096];
sprintf(tmp, "[bt] #%d %s\n", i-frames_to_skip, stack_strings[i]);
str += tmp;
}
free(stack_strings);
return str;
}
它的作品,但一些功能的名稱是缺少的。例如:
[bt] #0 /path/to/executable() [0x43e1b5]
[bt] #1 /path/to/executable() [0x43e0cd]
[bt] #2 /path/to/executable() [0x43df51]
[bt] #3 /path/to/executable() [0x43dd44]
[bt] #4 /path/to/executable() [0x43db50]
[bt] #5 /path/to/executable() [0x43d847]
[bt] #6 /path/to/executable() [0x43d216]
[bt] #7 /path/to/executable() [0x43c1e1]
[bt] #8 /path/to/executable() [0x43b293]
[bt] #9 /path/to/executable(_Z29SomeRN5other8symbolE+0x2c) [0x43a6ca]
[bt] #10 /path/to/executable(_Z11SomeIN5_8symbolEPFvRS1_EEvRKT_RKT0_+0x77) [0x441716]
...
功能0-8具有一個共同點:它們都在命名空間坐...
我試圖把功能9在匿名的命名空間(沒有任何其他修飾),並將其從所述在前看不見backtrace ...現在看起來像這樣:
[bt] #0 /path/to/executable() [0x43e1b5]
[bt] #1 /path/to/executable() [0x43e0cd]
[bt] #2 /path/to/executable() [0x43df51]
[bt] #3 /path/to/executable() [0x43dd44]
[bt] #4 /path/to/executable() [0x43db50]
[bt] #5 /path/to/executable() [0x43d847]
[bt] #6 /path/to/executable() [0x43d216]
[bt] #7 /path/to/executable() [0x43c1e1]
[bt] #8 /path/to/executable() [0x43b293]
[bt] #9 /path/to/executable() [0x43a6ca]
[bt] #10 /path/to/executable(_Z11SomeIN5_8symbolEPFvRS1_EEvRKT_RKT0_+0x77) [0x441716]
...
有沒有什麼辦法解決這個問題?
PS:版本的克++: 克++(GCC)4.6.0 20110530(紅帽4.6.0-9)固定回溯的最大深度代碼猴備註後
編輯
EDIT2添加的功能
EDIT3代碼編譯-O0 -g3與-rdynamic
你好,謝謝你的回答。你對最大深度是正確的,回溯的結束丟失了,但這不是問題,因爲這些缺少的調用來自我正在使用的測試框架。儘管如此,問題依然存在,而且我的博客文章也是如此。然而,一個有趣的事實是,測試框架在命名空間中確實有函數,並且它們在堆棧跟蹤中是可見的,我的函數不是......我再次執行了測試(將函數放入命名空間中),並再次重複(函數在回溯中不再可見... – foke