例外とバックトレースを使ったデバッグ
あるプログラムを使っていると std::out_of_range で abort したので、デバッグしようとするものの、C++ は例外で abort しても Java のようにバックトレースを表示してくれたりしないので、どこが問題か分かり難くて困った。
#include <cstdlib> #include <cstdio> #include <execinfo.h> namespace std { void __throw_out_of_range(const char* msg) { void *trace[128]; int n = backtrace(trace, sizeof(trace) / sizeof(trace[0])); backtrace_symbols_fd(trace, n, 1); int a = 0 / 0; printf("%d\n", a); abort(); } }
で、libstdc++ のコードを追っかけた挙げ句、上のようなコードを書いて共有ライブラリを作成、LD_PRELOAD に指定することでバックトレースを表示するという荒技をやってみた。
% g++ -shared -fPIC -Wl,-soname,libbt.so.1 -o libbt.so bt.cpp % LD_PRELOAD=/path/to/libbt.so prog
で、まぁうまくいったんだけど、ものすごい勢いでバッドノウハウだな。たぶん、もっといい方法があるだろうなぁ。