32

特定の状況下で C プログラムがコア ダンプを生成するようにします。これは実稼働環境で実行されるプログラムであり、他の種類のデバッグ コードを調整するために簡単に停止して再起動することはできません。また、本番環境なので、abort() を呼び出したくありません。調査中の問題は、非運用環境では簡単に再現できません。私が望むのは、プログラムが特定の問題を検出したときに、できればファイルの名前を変更するのに十分な情報を使用して、独自にコア ダンプを生成し、続行することです。

4

5 に答える 5

61
void create_dump(void)
{
    if(!fork()) {
        // Crash the app in your favorite way here
        *((void*)0) = 42;
    }
}

プロセスを fork し、子プロセスをクラッシュさせます - 必要なときにいつでもスナップショットを取得できます

于 2008-09-25T04:56:38.350 に答える
6

もう 1 つの方法は、Google Coredumperライブラリを使用することです。これにより、fork+abort 手法と同様の結果が得られますが、マルチスレッド アプリではより適切に機能します (fork する前にすべてのスレッドを少しの間中断して、子プロセスで混乱が生じないようにします)。

例:

    #include <google/coredumper.h>
    ...
    WriteCoreDump('core.myprogram');
    /* 続けて、コア ファイルを生成しました。
     * しかし、クラッシュしませんでした。
     */
于 2014-07-10T09:21:29.307 に答える
4

Sun は、Solaris、HP-UX、Redhat、および Windows でコア ファイルを取得する方法をここで説明しています。

Solaris には gcore プログラムがあります。HP-UX にある場合があります。それ以外の場合は、gdb とその gcore コマンドを使用します。Windows には win-dbg-root\tlist.exe と win-dbg-root\adplus.vbs があります。

于 2008-09-25T04:30:13.610 に答える
3

本当にコアが必要ですか、それともスタックトレースだけが必要ですか?スタックトレースだけが必要な場合は、ここでオープンソースを調べて、そこからコードを統合してみるか、コマンドラインから呼び出すだけで十分です。

gdbプロジェクトのいくつかのコードも役立つかもしれないと思います。

もう1つは、gdbを使用して実行中のプロセスにアタッチすることをお勧めします。

$ gdb /path/to/exec 1234 # 1234 is the pid of the running process
于 2008-09-25T04:33:44.070 に答える
2

コア ダンプを生成するソース コードは、gdb パッケージの一部である「gcore」にあります。

また、Sun にはgcoreがあります。

また、現在のプロセスを中断する必要があるため、コア ダンプを実行する別のプロセスが必要です。詳細は gcore ソースに記載されています。または、プロセスをターゲットとしてプラットフォームの gcore を実行することもできます。

于 2008-09-25T04:21:55.017 に答える