ホームページ >バックエンド開発 >PHPチュートリアル >ソフトウェアデバッグ技術(2) -- coredump_PHPの実装方法チュートリアル

ソフトウェアデバッグ技術(2) -- coredump_PHPの実装方法チュートリアル

WBOY
WBOYオリジナル
2016-07-12 09:02:151265ブラウズ

ソフトウェアデバッグ技術(2)--コアダンプの実装方法

最近、アプリケーションソフトウェアがクラッシュしたときにダンプファイルを生成するように設定できることを職場で知りました。これがコアダンプです。アプリケーションのクラッシュでもカーネルのクラッシュでも、ダンプ機能は非常に実用的なテクノロジーです。この記事は、これら 2 つのテクノロジの実装方法を実装原理の観点から理解することを目的としています。まず、アプリケーションのコアダンプの実装方法を分析しましょう。

どのような条件が転送をトリガーしますか?
この転送は、アプリケーションがこの信号を処理するときに実行され、その後実行が終了します。注意しなければならないことの 1 つは、ユーザーがこれらの致命的な信号用のカスタム ハンドラーをインストールした場合、転送は行われないということです。 OK、ここで 2 つのポイントがあります:
1. 致命的な信号の転送が開始されます。これらの信号には次のものが含まれます。

  1. 398 #define SIG_KERNEL_COREDUMP_MASK(
  2. 399 rt_sigmask(SIGQUIT)|rt_sigmask(SIGILL)|
  3. 400 rt_sigmask(SIGTRAP)|rt_sigmask(SIGAB) RT)|
  4. 401 rt_sigmask(SIGFPE)|rt_sigmask( SIGSEGV )|
  5. 402 rt_sigmask(SIGBUS)|rt_sigmask(SIGSYS)|
  6. 403 rt_sigmask(SIGXCPU)|rt_sigmask(SIGXFSZ)|
  7. 404 SIGEMT_MASK
2、上記の致命的なシグナルがインストールされた場合ユーザー コアダンプは、定義されたハンドラー関数に対しては発生しません

  1. 2264if(ka->sa.sa_handler!=SIG_DFL){
  2. 2265/*ハンドラーを実行します。*/
  3. 2266 ksig->ka= * ka;
  4. 2267
  5. 2268if(ka->sa.sa_flags&SA_ONESHOT)
  6. 2269 ka->sa.sa_handler=SIG_DFL;
  7. 2270
  8. 2271 Break;/*ゼロ以外の署名者を返す"value*/
  9. 2272}
カーネルが処理する必要のある信号を検索するとき、最初にその信号がデフォルトの処理方法であるかどうかを判断します。それがデフォルトの処理方法である場合、カーネルは次の処理に進みます。 coredump ブランチ、それ以外の場合は、ユーザー定義の処理メソッドを実行します。 info.si_signo);


2338 proc_coredump_connector(current);

    2339/*

  1. 2340*コアをダンプできた場合、これによりグループ内の他のスレッドがすべて強制終了されます

  2. 2341*と同期します

  3. 2342*彼らの終焉。ここに到達する別の

  4. 2343*スレッドとの競争に負けた場合、itsetgroup_exit_code

  5. 2344*first と do_group_exitcallbelow は

  6. 2345*その値を使用し、渡した値を無視します。

  7. 2346*/

  8. 234 7 do_coredump(&ksig->info);

  9. 2348}


  10. proc ディレクトリで次のオプションを有効にすると、致命的なシグナルをコンソールに出力する機能がコンソールが有効になります。
  11. /proc/sys/kernel/print-fatal-signals
  12. コアダンプの主な手順
  13. 実際、このアプリケーションをディスクに書き込むプロセスは非常に責任のあるものでなければなりません。ここでは、詳細な研究と分析のために、理論的な詳細の一部を後回しにする場合があります。ただし、ここではコアダンプに関する次の主要な処理プロセスを理解する必要があります。
    1. コアダンプの前に、まずスレッド グループ内のすべてのスレッドが休止状態に入っているかどうかを確認します。コアダンプが必要な場合は、このプロセスのメモリ領域をコピーするときに、プロセス内の一部のスレッドがまだ実行中であり、メモリ領域を書き換えていることを確認する必要があります。
  14. 2. プロセスメモリをファイルに直接転送することについては何も特別なことはありません。ファイルを開いて書き込みを開始するだけです。
  15. 3. ユーザー空間スクリプトが作成され、いくつかの圧縮操作が実行される場合、ユーザー状態プロセスが開始され、カーネルとユーザー状態プロセスの間にパイプラインが確立されます。
  16. kernel=======。 ===読み出し =========== ユーザーモード処理(圧縮) -----------書き込み--------> ファイル

  17. 最初のステップとして処理、カーネル プロセス グループ内のすべてのスレッドに kill シグナルを送信し、すべてのプロセスが実行されなくなるまで待機します。
  18. 2 番目のステップの処理は比較的単純ですが、興味がある場合は、コアダンプ ファイルの形式がどのようなものであるかをさらに調べることができます。 3 番目のステップは比較的複雑ですが、カーネルでパイプラインを確立し、コアダンプをパイプラインに書き込み、新しく作成されたプロセスのパイプラインのもう一方の端が に設定されます。標準入力。
圧縮プロセスダンプ方法の場合
シェル実行可能ファイルを作成できます
#!/bin/sh
execgzip->/root/$1.core.$2.gz
次に/proc/sys/kernel/core_patternに書き込みます
|/usr/sbin/core_helper%e%p


www.bkjia.com本当http://www.bkjia.com/PHPjc/1086427.html技術記事ソフトウェアデバッグ技術(2) - コアダンプの実装方法 最近、アプリケーションソフトがクラッシュしたときにダンプファイルを生成する機能があることを仕事で知りました。アプリなのか…
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。