私の(C++)プログラムの実行のある時点でバックトレースを取得しようとしています。スタックトレースと名前空間での機能
私はバックトレースと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;
}
機能はありますが、一部の機能名がありません。例:私は(他の修正なし)無名の名前空間内の関数9を入れてみました
...彼らはすべての名前空間に座って、それからdisapears:
[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つの共通点を持っていますバックトレース...次のようになります。それを修正する方法はあり
[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:++グラムのバージョン: G ++(GCC)4.6.0 20110530(Red Hatの4.6.0-9)コードモンキーの発言の後にバックトレースの最大の深さを固定
編集
EDIT2
EDIT3コードは-O0 -g3してコンパイルし、使用している機能かもしれ-rdynamic
こんにちは、お返事ありがとうございます。あなたは最大深さについて正しいですが、バックトレースの最後は欠落していましたが、それらの欠落した呼び出しは私が使用しているテストフレームワークからのものであったため、問題はありません。それでも問題は残っており、私はブログ記事と同じことを言っています。ただし、テストフレームワークは名前空間に関数を持ち、stacktraceに表示されています。私の関数はそうではありません...私は再びテストを行いました(名前空間に関数を入れました)バックトレースではもはや表示されません... – foke