特定の状況下で C プログラムがコア ダンプを生成するようにします。これは実稼働環境で実行されるプログラムであり、他の種類のデバッグ コードを調整するために簡単に停止して再起動することはできません。また、本番環境なので、abort() を呼び出したくありません。調査中の問題は、非運用環境では簡単に再現できません。私が望むのは、プログラムが特定の問題を検出したときに、できればファイルの名前を変更するのに十分な情報を使用して、独自にコア ダンプを生成し、続行することです。
5 に答える
void create_dump(void)
{
if(!fork()) {
// Crash the app in your favorite way here
*((void*)0) = 42;
}
}
プロセスを fork し、子プロセスをクラッシュさせます - 必要なときにいつでもスナップショットを取得できます
もう 1 つの方法は、Google Coredumperライブラリを使用することです。これにより、fork+abort 手法と同様の結果が得られますが、マルチスレッド アプリではより適切に機能します (fork する前にすべてのスレッドを少しの間中断して、子プロセスで混乱が生じないようにします)。
例:
#include <google/coredumper.h> ... WriteCoreDump('core.myprogram'); /* 続けて、コア ファイルを生成しました。 * しかし、クラッシュしませんでした。 */
Sun は、Solaris、HP-UX、Redhat、および Windows でコア ファイルを取得する方法をここで説明しています。
Solaris には gcore プログラムがあります。HP-UX にある場合があります。それ以外の場合は、gdb とその gcore コマンドを使用します。Windows には win-dbg-root\tlist.exe と win-dbg-root\adplus.vbs があります。
本当にコアが必要ですか、それともスタックトレースだけが必要ですか?スタックトレースだけが必要な場合は、ここでオープンソースを調べて、そこからコードを統合してみるか、コマンドラインから呼び出すだけで十分です。
gdbプロジェクトのいくつかのコードも役立つかもしれないと思います。
もう1つは、gdbを使用して実行中のプロセスにアタッチすることをお勧めします。
$ gdb /path/to/exec 1234 # 1234 is the pid of the running process
コア ダンプを生成するソース コードは、gdb パッケージの一部である「gcore」にあります。
また、Sun にはgcoreがあります。
また、現在のプロセスを中断する必要があるため、コア ダンプを実行する別のプロセスが必要です。詳細は gcore ソースに記載されています。または、プロセスをターゲットとしてプラットフォームの gcore を実行することもできます。