1. ホーム
  2. Qt

セグメンテーションフォールト(コアダンプ)の解決法

2022-02-16 02:15:16
<パス

コアダンプはコアダンプとも呼ばれ、プログラム実行中に例外が発生してプログラムが異常終了すると、OSはそのプログラムの現在のメモリ状況をコアファイルに保存し、コアダンプと呼びます。(linuxはメモリが範囲外の場合、SIGSEGVシグナルを受信してコアダンプします)

プログラム動作中にSegment faultエラーに遭遇することがあります。スタックやトレース情報が出力されないので、難しそうです。この種のエラーは、ポインタ操作に関係することが多い。このように場所が特定できることが多いです。

I セグメントフォルトの考えられる原因、コアダンプの生成

1. 圏外メモリアクセス

a) 誤った添え字による境界外配列アクセス
b) 文字列を検索する際、文字列が終了したかどうかを文字列のターミネータに依存しているが、文字列がターミネータを適切に使用していない
c) strcpy, strcat, sprintf, strcmp, strcasecmp などの文字列操作関数を使用して、対象の文字列を読み書きをはじく。strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmpなどの関数は、境界外への読み書きを防ぐために使用する必要があります。

2 マルチスレッドプログラムでは、スレッドセーフでない関数を使用します。

3 マルチスレッドは、ロックで保護されていないデータを読み書きします。

複数のスレッドから同時にアクセスされるグローバルデータについては、ロックで保護するように注意しないと、簡単にコアダンプが発生する可能性があります

4 不正なポインタ

a) ヌルポインタの使用
b) ポインタの変換をやみくもに使用する。メモリのセクションへのポインタは、そのメモリがもともとそのような構造体や型、またはそのような構造体や型の配列に割り当てられていたことが確かでない限り、構造体や型へのポインタに変換してはならず、代わりに構造体や型にコピーしてアクセスすべきなのです。このメモリの開始アドレスがこの構造体や型にアラインされていないと、アクセス時にバスエラーでコアダンプしやすくなるからだ。

5 スタックオーバーフロー

大きなローカル変数は使わないでください(ローカル変数はスタック上に確保されるため)。スタックオーバーフローを起こしやすく、システムのスタックやヒープの構造が壊れて、不可解なエラーにつながる可能性があります。

II コアファイルを生成するためのOSの設定

まず、ulimitコマンドでダンプ・コアをサポートするようにシステムが設定されているかどうかを確認します。ulimit -c または ulimit -a でコアファイルのサイズの設定を確認することができます。0であれば、システムはダンプコアをオフにしています。ulimit -c unlimitedでオンにすることができます。セグメントエラーが発生しても、コアダンプがない場合は、システムがコアファイルの生成を無効にしているためです。
解決方法

$ulimit -c unlimited (only valid for the current shell process)

または、~/.bashrc の最後に ulimit -c unlimited (一度きりで) を追加してください。

# ulimit -c
$ ulimit -a

$ ulimit -a

コアファイルのサイズ(ブロック数、-c) 0
データセグサイズ (kbytes, -d) 無制限
ファイルサイズ (ブロック, -f) 無制限

III gdb によるコアファイルの閲覧

コアダンプの後、gdbを使ってコアファイルの内容を表示し、コアダンプの原因となったファイル内の行を探します。
gdb [実行ファイル] [コアファイル]
例)gdb . /test test.core

リンク http://blog.sina.com.cn/s/blog_75bf554501019cvt.html