GNU/Linux >> Linux の 問題 >  >> Linux

セグメンテーション違反を見つける最も簡単な方法

+1 Tibors の回答。

大規模なプログラムや追加のライブラリを使用する場合は、gdb でバックトレースを確認することも役立つ場合があります:ftp://ftp.gnu.org/pub/old-gnu/Manuals/gdb/html_node/gdb_42.html


gdb などのデバッガーを使用する または、これが当てはまらない場合は strace

gcc を使用する場合 、必ず -g でコンパイルしてください デバッグ情報を含めるように切り替えます。次に、gdb segfault が発生したソース コード内の正確な場所が表示されます。

たとえば、この明らかな segfaulty プログラムがある場合:

new.c

#include <stdio.h>

int main()
{
        int *i = 0x478734;
        printf("%d", *i);
}

gcc -g new.c -o new でコンパイルします gdb を実行します gdb new とのセッション :

run を発行します 対話型セッションのコマンドであり、それ以外は明確です:

(gdb) run
Starting program: /home/Tibor/so/new
[New Thread 9596.0x16a0]
[New Thread 9596.0x1de4]

Program received signal SIGSEGV, Segmentation fault.
0x0040118a in main () at new.c:6
6               printf("%d", *i);
(gdb)

DasMoeh さんと netcoder さんが指摘しているように、segfault が発生した場合、backtrace を使用できます。 コマンドを対話型セッションで使用して、コール スタックを出力します。これは、セグメンテーション違反の場所をさらに特定するのに役立ちます。


最も簡単な方法は valgrind を使用することです .無効なアクセスが発生した場所 (および、クラッシュを引き起こさなかったが無効だったその他の問題) を特定します。もちろん、実際の問題はコードの別の場所にある可能性があります (例:無効なポインター)。そのため、次のステップはソースを確認し、それでも混乱する場合はデバッガーを使用することです。


Linux
  1. UbuntuにZoomをインストールする方法(最も簡単な方法)

  2. Apache2 configtestが失敗しました:セグメンテーション違反(コアダンプ)[解決済み]

  3. Flameshot –スクリーンショットを撮って注釈を付ける最も簡単な方法

  1. debian で仮想パッケージを作成する最も簡単な方法は何ですか?

  2. Crontab では、n > 60 の n 分ごとに指定する一般的な方法

  3. Linux / Apache Web サーバー セグメンテーション エラーの警告

  1. RDP Linux から Windows へ:最も簡単な方法 2019!

  2. glibc の fclose(NULL) がエラーを返す代わりにセグメンテーション違反を引き起こすのはなぜですか?

  3. Qt QApplication が new で作成されたときのセグメンテーション違反