11

この質問この質問を見ると、機能するにはフラグbacktrace_symbols()を使用してコンパイルする必要があることがわかります。-rdynamic

テストプログラムで試してみましたが、動作しますが、でコンパイルされたプログラムを作成し-staticています。このページには、コンパイラ/リンカーに渡されたbacktrace_symbols()ときに動作しないと書かれています。-static

これに対する簡単な回避策はありますか、それとも静的にリンクされたプログラムに人間が読める形式のバックトレース機能がありませんか?

4

2 に答える 2

10

答えはすでに手元にありました:それは私が質問でリンクしたのと同じページにありました。最後に、私は正常に使用しlibunwindました。

#include <libunwind.h>
#include <stdio.h>

void do_backtrace()
{
    unw_cursor_t    cursor;
    unw_context_t   context;

    unw_getcontext(&context);
    unw_init_local(&cursor, &context);

    while (unw_step(&cursor) > 0)
    {
        unw_word_t  offset, pc;
        char        fname[64];

        unw_get_reg(&cursor, UNW_REG_IP, &pc);

        fname[0] = '\0';
        (void) unw_get_proc_name(&cursor, fname, sizeof(fname), &offset);

        printf ("%p : (%s+0x%x) [%p]\n", pc, fname, offset, pc);
    }
}

int main()
{
 do_backtrace();
 return 0;
}

コマンドラインの最後にリンカーオプションを配置するのを(再び)忘れていたため、リンクエラーが発生していました。g++コマンドラインオプションを無視するときに、なぜ/gcc少なくとも警告を出さないのか、私は本当に理解していません。コンパイルする正しいコマンドラインは次の-gとおりです(必須ではありません)。

g++ -static unwind.cpp -o unwind -lunwind -lunwind-x86
于 2012-11-13T12:58:30.427 に答える
3

プログラムを静的としてコンパイルする必要がある場合でも、関数のアドレスを見つけてから、たとえばlibdwarfbacktrace()を使用してデバッグ情報を解析することにより、関数名を見つけることができます。

しかし、それは簡単な作業ではないので、-rdynamicフラグを使用することをお勧めします。

于 2012-11-09T14:19:46.387 に答える