元のアドレス:https://www.cnblogs.com/flyinggod/p/13415862.html
関連記事
1.コアファイルの機能、設定、使用法---- https://www.cnblogs.com/xiaodoujiaohome/p/6222895.html
2.Linuxシステム設定ulimitとコアファイルの生成-https://blog.csdn.net/zjb9605025/article/details/6553184
1 2 3 4 5 6 7 8 9 10 |
|
コアダンプの生成方法
Linux環境では、例外が原因でプロセスがハングし、通常は原因を特定するのが困難ですが、Linuxカーネルが提供するコアファイルは、通常、クラッシュ時にプロセスの情報を記録します。ただし、コアファイルを生成するにはスイッチを設定する必要があります。具体的な手順は次のとおりです。
1.コアファイルを生成するためのスイッチがオンになっているかどうかを確認し、コマンドを入力します
ulimit -a
最初の行のコアファイルサイズは0であり、有効になっていません。
2. ulimit -c [kbytes]を使用して、システムで許可されるコアファイルサイズを設定します。
1 2 3 |
|
コマンドulimit-c limitlimitedを実行してから、ulimit-aを実行してコアを表示します
このように、プロセスがクラッシュしたときにコアファイルを生成できます。このメソッドはシェルでのみ有効になります。この設定が常に有効な場合は、次の設定を行う必要があります。
1 2 |
|
保存して終了し、サーバーを再起動すると、変更されたファイルが長期間有効になります。または
ソース/ etc / profile
サーバーを再起動せず、ソースを使用してファイルをすぐに有効にします。
3.生成されたファイルのパスと名前を指定します
デフォルトでは、コアダンプによって生成されるファイル名はcoreであり、プログラムの現在のディレクトリにあります。新しいコアは既存のコアを上書きします。/proc/sys/kernel/core_uses_pidファイルを変更することで、コアファイルの保存場所とファイル形式を制御できます。
vim /etc/sysctl.conf#編集モードに入り、次の2行を追加します kernel.core_pattern = / tmp / corefile / core_%t_%e_%p kernel.core_uses_pid = 0
varの下にコアディレクトリを作成し、
sysctl –p /etc/sysctl.conf
変更はすぐに有効になります。
core_patternの名前付きパラメーターは次のとおりです。
%cダンプファイルサイズの上限 %eダンプされたファイル名 %gダンプされたプロセスの実際のグループID %hホスト名 %pダンプされたプロセスPID %sこのコアダンプの原因となったシグナル %tダンプ時間( 1970年1月1日からの秒数) %uダンプされたプロセスの実際のユーザーID
4.ターミナルでコマンドkill-s SIGSEGV $$を実行すると、コアファイルが/ tmp / corefileの下に生成され、設定が成功したことがわかります。
コアファイルは、次の条件下では生成されません。
1 2 3 4 |
|
コアダンプ生成の原理
コアダンプは通常、プロセスが特定のシグナルを受信したときに発生します。現在、Linuxには60を超えるシグナルがあります。kill-lコマンドを使用して、それらすべてを一覧表示できます。
特定の信号について、アプリケーションは対応する信号処理関数を書き込むことができます。指定しない場合、デフォルトの処理方法が採用されます。デフォルトの処理は、次のようなコアダンプのシグナルです。
1 2 |
|
SIGSEGVが含まれていることがわかります。通常、この信号は、配列が範囲外の場合、またはnullポインターにアクセスした場合に生成されます。さらに、これがデフォルトですが、独自の信号処理関数を記述してデフォルトの動作を変更することもできます。Googleで信号関連の詳細を確認することもできます。
コアダンプファイルのデバッグ
1 2 3 4 5 6 7 8 9 10 11 12 |
|
上記のコードは、コアダンプを生成するサンプルコードです。
このとき、この実行可能プログラムの下に新しいコアファイルが生成されます
プロセスがクラッシュした場所を確認する
クラッシュのラインを見つけます
コンパイル時に-gデバッグスイッチをオンにできます
1 |
|
coredumグローバルモードを設定したくない場合は、現在のプロセスのクラッシュ場所を特定できるコアファイルを生成するだけで済みます。必要な操作は4つだけです。
1 2 3 4 |
|
上記のプログラムをコンパイルするときに注意することの1つは、生成された実行可能プログラムが十分なデバッグ情報をもたらすように、パラメーター-gを持ってくる必要があります。コンパイルして実行すると、待望の「Segment Fault(コアダンプ)」または「SegmentFault(コアダンプ)」という単語が表示されるはずです。現在のディレクトリにcoreまたはcore.xxxファイルがあるかどうかを確認します。LinuxでクラシックデバッガGDBを使用し、最初にコアファイルgdb exefile coreをプログラムにロードします。ここでは、コアファイルがexefileによって生成される必要があることに注意する必要があります。そうしないと、シンボルテーブルがアップロードされません。ロード後はこんな感じ
1 2 3 4 5 6 |
|
コアを直接見つけて、8行目に読み取り専用メモリ領域を書き込むことができることがわかります。これにより、SegmentFault信号がトリガーされます。コアをロードする際のちょっとしたコツがあります。どのプログラムがコアファイルを生成したかが事前にわからない場合は、それを置き換えるプログラムを見つけることができます。たとえば、/ usr / bin / wが適切です。たとえば、このメソッドを使用して上記で生成されたコアをロードすると、gdbは同様の出力を持ちます
1 2 3 4 5 |
|
GDBは、どのプログラムがこのコアを生成したかをすでに通知していることがわかります。
GDBの一般的な操作
上記のプログラムは比較的単純であり、問題は追加の操作なしで直接見つけることができます。これは実際には当てはまりません。問題をスムーズに特定するために、シングルステップトラッキング、ブレークポイントの設定、およびその他の操作を実行する必要がある場合がよくあります。GDBの一般的な操作のいくつかを以下に示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|