例外がスローされた後、スタックトレースを分析するために使用addr2line
しています (backtrace と backtrace_symbols を使用)。現在、ディスクから 120Mb のバイナリ (デバッグ ビルド) を分析するには、約 2 秒かかります。
メモリ内のコード セグメントを分析することによって同じ仕事をするライブラリ (LGPL) はありますか? もちろん、これは自分のアプリケーションのみを分析することを制限しますが、私のユースケースではこれで十分です。
例外がスローされた後、スタックトレースを分析するために使用addr2line
しています (backtrace と backtrace_symbols を使用)。現在、ディスクから 120Mb のバイナリ (デバッグ ビルド) を分析するには、約 2 秒かかります。
メモリ内のコード セグメントを分析することによって同じ仕事をするライブラリ (LGPL) はありますか? もちろん、これは自分のアプリケーションのみを分析することを制限しますが、私のユースケースではこれで十分です。
あなたが欲しい(BSDライセンス)libunwind:
void backtrace(void)
{
int r;
unw_cursor_t cursor; unw_context_t uc;
unw_word_t ip, sp;
char symname[100];
unw_getcontext(&uc);
unw_init_local(&cursor, &uc);
while (unw_step(&cursor) > 0) {
r = unw_get_reg(&cursor, UNW_REG_IP, &ip);
assert(r == 0);
r = unw_get_reg(&cursor, UNW_REG_SP, &sp);
assert(r == 0);
r = unw_get_proc_name(&cursor, symname, sizeof(symname), NULL);
assert(r == 0);
fprintf(stderr, "%s: ip: %lx, sp: %lx\n", symname, (long) ip, (long) sp);
}
}
unw_get_proc_name()
バイナリからシンボル テーブルと文字列テーブルを削除すると、失敗する (0 以外を返す)ことに注意してください。
procファイルシステムによって認識される実行可能ファイルを使用できますか?(または、実際にはプロセスのメモリ内の実行可能ファイルですか?)
addr2line -e /proc/32213/exe
GCC ディストリビューションの一部である Libbacktrace がこれを行います。スタックの巻き戻し、ELF シンボル、およびデバッグ シンボルを処理します。つまり、libunwind と addr2line の両方の機能を提供します。
ここにスタンドアロンのフォークを置きました。