このようなセグメンテーション エラーがsegfault at 157e8250 ip 157e8250 sp bfa3fdfb
表示されます。このアドレスを、エラーが発生した対応するコードにマップするにはどうすればよいですか?
4 に答える
gccの「-g」オプションを追加する必要があります
gnuツール「addr2line」を使用します。
# addr2line -e a.out 0x80484c8 -f -e: executable file name -f: generate function name
GNU binutilsスイートの addr2line ユーティリティを使用します。たとえば、これは、エラーが発生したアドレス 0x157e8250 のファイル名、行番号、および関数名 (C++ 関数の場合はデマングル) を出力します。
addr2line -e my_executable_file -C -f 0x157e8250
また、命令アドレスのみのスタック トレースがある場合など、コマンド ラインで任意の数のアドレスを渡すこともできます。
コンパイラ オプションを使用してプログラムをコンパイルし、-g
デバッグ シンボルを生成するようにしてください。そうしないと、addr2line
何もシンボル化できません。
コンパイルできるソースコードがあると仮定します。デバッグシンボルを使用してコンパイルし、gdbで実行すると、行番号やその他の優れた機能を含むスタックトレースが出力されます。
Valgrindの使用をお勧めします。使用法は次のとおり
valgrind <your program name> <command-line arguments to your program>
です。デバッグシンボルをオンにしてコンパイルすると(-g
gccのオプションを使用)、セグメンテーション違反が発生したスタック内のすべてのレベルの正確な行番号を取得できます。