あるプログラムを使っていると 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

" , 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

で、まぁうまくいったんだけど、ものすごい勢いでバッドノウハウだな。たぶん、もっといい方法があるだろうなぁ。