15

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

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

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

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

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

  1. プログラムの「リリース」ビルドでコア ダンプを作成する方法は?
  2. いつも。ulimit -c unlimited" "を手動で実行せずに
4

5 に答える 5

11
  • コア制限については、Cでを呼び出すことで自分で行うことができますsetrlimit
  • backtraceGNU(glibc)またはBSDシステムでは、呼び出しおよび関連するシステムコールによってバックトレースを取得できます。addr2line次に、実行する(またはその機能を複製する)ことにより、関数アドレスを関数名に変換する必要があります。
  • を使用しない-gでください。バックトレースを取得できます(インライン関数が表示されない場合を除く)。
于 2010-02-12T11:30:23.170 に答える
7

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

ユーザーのマシンで人間が読めるバックトレースを印刷したい場合は、(いくつかの) デバッグ情報を含むバイナリを配布する必要があります。glibc で「backtrace()」関数を探します。

バイナリにデバッグ情報が含まれていなくても、コア ダンプが作成されることに注意してください (ulimit が適切に設定されている場合)。

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

于 2010-02-12T11:27:47.143 に答える
3

google-coredumper を試すことができます:

プログラムの実行中に、マルチスレッド アプリケーションから GDB 読み取り可能なコアダンプを作成するための優れたツール。コアダンパー ライブラリをアプリケーションにコンパイルして、終了せずに実行中のプログラムのコア ダンプを作成できます。

http://sourceforge.net/projects/goog-coredumper/

于 2010-02-12T12:16:56.827 に答える
2
  1. Linuxには「リリース」バージョンや「デバッグ」バージョンなどはありません。「-g」を使用すると、デバッグ情報を使用してプログラムを作成するだけです。この情報を取り除くことができます。

更新
実際には、メッセージで言及しなかったデバッグバージョンとリリースバージョンの1つの考えられる違いについて言及する必要があると思います。プログラム内のすべてを取り除くために、リリースバージョンはNDEBUG定義を使用してビルドされる場合がありますassert()assert()それどころか、デバッグバージョンは、バグを見つけるのに役立つ NDEBUGを定義せずにビルドする必要があります。

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

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

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

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

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

于 2010-02-12T11:31:56.130 に答える
-4

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

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

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

于 2010-02-12T11:27:52.960 に答える