例外とバックトレースを使ったデバッグ

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

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