4

このようなセグメンテーション エラーがsegfault at 157e8250 ip 157e8250 sp bfa3fdfb表示されます。このアドレスを、エラーが発生した対応するコードにマップするにはどうすればよいですか?

4

4 に答える 4

5
  1. gccの「-g」オプションを追加する必要があります

  2. gnuツール「addr2line」を使用します。

    # addr2line -e a.out 0x80484c8 -f
    
    -e: executable file name
    -f: generate function name 
    
于 2012-10-12T04:41:50.557 に答える
5

GNU binutilsスイートの addr2line ユーティリティを使用します。たとえば、これは、エラーが発生したアドレス 0x157e8250 のファイル名、行番号、および関数名 (C++ 関数の場合はデマングル) を出力します。

addr2line -e my_executable_file -C -f 0x157e8250

また、命令アドレスのみのスタック トレースがある場合など、コマンド ラインで任意の数のアドレスを渡すこともできます。

コンパイラ オプションを使用してプログラムをコンパイルし、-gデバッグ シンボルを生成するようにしてください。そうしないと、addr2line何もシンボル化できません。

于 2012-10-12T04:39:41.897 に答える
2

コンパイルできるソースコードがあると仮定します。デバッグシンボルを使用してコンパイルし、gdbで実行すると、行番号やその他の優れた機能を含むスタックトレースが出力されます。

于 2012-10-12T04:30:58.043 に答える
2

Valgrindの使用をお勧めします。使用法は次のとおり valgrind <your program name> <command-line arguments to your program>です。デバッグシンボルをオンにしてコンパイルすると(-ggccのオプションを使用)、セグメンテーション違反が発生したスタック内のすべてのレベルの正確な行番号を取得できます。

于 2012-10-12T04:33:55.440 に答える