3

私は下で開発していますLinux/gcc

現在、以下を使用して、スローされたカスタム例外のスタック トレースを取得しています。Demangled関数名 とは期待どおりですが、出力文字列のフォーマットを完全に制御するline numbersために を使用することは避けたいと思います。addr2line

static void posix_print_stack_trace()
{
    int i, trace_size = 0;
    char **messages = (char **)NULL;

    trace_size = backtrace(stack_traces, MAX_STACK_FRAMES);
    messages = backtrace_symbols(stack_traces, trace_size);

    for (i = 0; i < trace_size; ++i)
    {
        if (addr2line(program_invocation_name, stack_traces[i]) != 0)
        {
            printf("  error determining line # for: %s\n", messages[i]);
        }
    }
    if (messages) { free(messages); }
}

static int addr2line(char const * const program_name, void const * const addr)
{
    char addr2line_cmd[512] = {0}; 
    sprintf(addr2line_cmd,"addr2line -C -f -p -i -e %.256s %p", program_name, addr);
    return system(addr2line_cmd);
}

注 :を使用-fして、スタック トレースで実行中の関数名-Cを表示し、デマングルして表示します。

Q:プログラムによる解決策を教えてくれる人はいますか? (そして、可能であれば、それをうまく機能させる方法についてアドバイスをくださいMinGW/gcc)。

NB: または、単にgdb何らかの方法で使用することで、よりカスタマイズされた出力を取得するのに役立つ可能性がありますか?

助けてくれてありがとう。

編集:Windowsの部分のように見えますが、そのように実行できます:https://stackoverflow.com/a/6207030/1715716

編集:上記は Microsoft Visual のみのソリューションを指しているため、最終的には役に立ちません。

4

1 に答える 1

3

libbacktraceおそらく、現在 GCC ソース ツリー内にある Ian Taylor による(少なくとも Linux、および ELF と DWARF を使用するシステムでは) を使用または適応させることができます。ここを参照してください。原則として、GCC とは独立して使用できるはずです (ただし、BSD のようなライセンスに従うことが条件です)。

于 2013-05-28T13:17:21.870 に答える