質問

プロセスがクラッシュするたびにコアダンプを作成したいと思います。現在、私はこのアプローチに従っています:

  1. GCC/G ++の「-G」を使用して、プログラムの特別な「デバッグ」バージョンを構築します。
  2. 「ulimit -c linmited」を実行する
  3. これで、プログラムがクラッシュするたびにコアダンプを取得します。

しかし、私は次のようにステップ数を最小限に抑えたいと思っています。

  • コアダンプは常に作成される必要があります。 「リリース」ビルドであっても。ユーザーはコマンドを実行するように求められないでください」ulimit -c unlimited「手動で。
  • そのコアダンプのバックトレースは、呼び出しのファイル、関数、行番号を与えることができるはずです。これは、人間の読み取り可能な形式のスタックトレースです。
  • 「-G」を使用したデバッグビルドとしてプログラムを構築したくありません。または、少なくとも、人間の読み取り可能なスタックトレースを生成するために必要とされない他のデバッグ情報を含めるべきではありません。これはプログラムのリリースビルドになるからです。

だから私には2つの質問があります:

  1. プログラムの「リリース」ビルドでコアダンプを作成する方法は?
  2. いつも。手動で実行することなく」ulimit -c unlimited"
役に立ちましたか?

解決

通常の解決策は、ファイルをリリースする前に-gで構築し、デバッグ情報を削除することです。 「ストリップ」コマンドを探します。ファイルをデバッグ情報で保持し、それを使用して、顧客から得たコアダンプをデバッグします。

ユーザーマシンに人間の読み取り可能なバックトレースを印刷する場合は、(一部の)デバッグ情報でバイナリを配布する必要があります。 glibcで「backtrace()」関数を探します。

バイナリにデバッグ情報が含まれていない場合でも、コアダンプが作成されている場合(Ulimitが適切に設定されている場合)。

コアダンプの作成を確保する最良の方法は、おそらくバイナリを実行する前にulimitを設定するスクリプトからバイナリを実行することです。

他のヒント

  • コアの制限に関しては、電話をかけることで自分でそれを行うことができます setrlimit.
  • GNU(GLIBC)またはBSDシステムでは、呼び出してバックトレースを取得できます backtrace 関連システム呼び出し。その後、実行することにより、関数アドレスを関数名に変換する必要があります addr2line (またはその機能の複製)。
  • 使用しないでください -g, 、まだバックトレースを取得できます(インラインド関数が表示されないことを除きます)。

Google-Coredumperを試すことができます:

プログラムが実行されている間、マルチスレッドアプリケーションからGDB読み取り可能なCoreDumpsを作成するためのきちんとしたツール。 CoreDumperライブラリをアプリケーションにコンパイルして、実行中のプログラムのコアダンプを作成できます。

http://sourceforge.net/projects/googedumper/

  1. Linuxには、「リリース」バージョンや「デバッグ」バージョンなどのものはありません。 「-G」を使用すると、情報をデバッグするとプログラムを作成するだけです。この情報を削除できます。

更新しました
実際、私は自分のメッセージで言及していなかったデバッグとリリースのバージョンの間に1つの可能な違いについて言うべきだと思います。リリースバージョンは、すべてを取り除くためにndebug定義で構築される場合があります assert() プログラムで。逆にデバッグバージョンは、ndebugを定義せずに構築する必要があります assert() バグを見つけるのに役立ちます。

ただし、使用しない場合 assert() 違いはありません。

  1. ユーザーは、ulimit -cを自分のプロフィールで無制限に設定できます。

  2. いくつかの最適化をコンパイルしたプログラムのバックトレースは、多くの場合、有用なライン番号を与えません。

  3. 情報をデバッグしてバージョンを作成し、アーカイブに入れることができます。次に、それを剥がし、剥がれたバイナリを顧客に届けます。顧客がコアファイルを提供している場合は、顧客からのデバッグ情報とコアファイルを備えたバージョンを使用してください。

  4. How to create a core dump in the "release" build of a program? それはあなたの責任ではなく、OSの責任です。

コードがリリースモード/高度に最適化されたバージョンである場合、人間の形で適切なスタックトレースを取得することはほとんどありません。 -gスイッチを使用するか、スタックトレースを完全に実行することを忘れてください...両方を持つことはできません!!これがこの点に戻ってきます - 生産環境でもコードがクラッシュすると予想しているように聞こえますか?

コードを修正して、最初に機能することを確認してみませんか...コードの匂いがします.... スニフスニッフ

編集: わかりました、私は上記の私のコメントで少し厳しいことに出くわしたかもしれません、私はそこに厳しいことを意図していませんでした...読者の利益のために、私はここに投稿された別の質問へのリンクを含めました、そしてその中に 答え 私は、信号を使用してスタックトレースを作成し、ファイルにリダイレクトしました。それはOPの質問に役立ち、彼がトラブルシューティングを助けます...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top