セグメンテーションフォールト(コアダンプ)の解決法
コアダンプはコアダンプとも呼ばれ、プログラム実行中に例外が発生してプログラムが異常終了すると、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
関連
-
ERR_CONTENT_LENGTH_MISMATCH 問題解決のためのハンドブック
-
gcc コンパイル時にオペランドがバイナリに変換されない -解決方法
-
linux環境:警告。ISO C++は文字列定数を'char*'に変換することを禁じている[-Write-strings]。
-
BadPaddingException:与えられた最終ブロックが適切にパディングされていない
-
Makefile 実行中のエラー: make: *** xxx が必要とするターゲット ` ' を作成するためのルールがありません。
-
ソケットプログラミング、エラーの原因 ソケット以外でのソケット操作
-
名前解決のエラー解決に一時的な障害が発生
-
linuxのセグメンテーション障害
-
Werror=unused-but-set-variableエラーの解決法
-
コンパイル時の警告をなくす(Warning)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
シェルスクリプト二項演算子期待値エラー
-
ARM Linuxの割り込みメカニズム解析
-
解決済み gpg: 有効な OpenPGP データが見つかりません。
-
SocketExceptionです。ブロークン・パイプ・エラーの可能性
-
AttributeError: Linux上のFLASKプロジェクトでデータベースに接続すると、属性を設定できない
-
Python3.xでprintを使用する際のエラー(SyntaxError: Missing parenthes in call to 'print')に対する解決策を公開しました。
-
CentOS 7のインストールとDockerの展開
-
socket.errorを解決する。[Errno 98] アドレスが既に使用されている問題
-
nginx の Linux インストール 'struct crypt_data' には 'current_salt' という名前のメンバがない 解決方法
-
中国標準のKirin OSのyumソースの構成