2

例外がスローされた後、スタックトレースを分析するために使用addr2lineしています (backtrace と backtrace_symbols を使用)。現在、ディスクから 120Mb のバイナリ (デバッグ ビルド) を分析するには、約 2 秒かかります。

メモリ内のコード セグメントを分析することによって同じ仕事をするライブラリ (LGPL) はありますか? もちろん、これは自分のアプリケーションのみを分析することを制限しますが、私のユースケースではこれで十分です。

4

3 に答える 3

3

あなたが欲しい(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 以外を返す)ことに注意してください。

于 2012-07-01T07:14:28.190 に答える
0

procファイルシステムによって認識される実行可能ファイルを使用できますか?(または、実際にはプロセスのメモリ内の実行可能ファイルですか?)

addr2line -e /proc/32213/exe
于 2012-06-29T23:37:04.817 に答える
0

GCC ディストリビューションの一部である Libbacktrace がこれを行います。スタックの巻き戻し、ELF シンボル、およびデバッグ シンボルを処理します。つまり、libunwind と addr2line の両方の機能を提供します。

ここにスタンドアロンのフォークを置きました。

https://github.com/ErwanLegrand/libbacktrace

于 2015-05-27T10:02:28.523 に答える