98

C++アプリケーションの特定の場所にコアダンプを強制したいと思います。

私は次のようなことをすることでそれができることを知っています:

int * crash = NULL;
*crash = 1;

しかし、もっとクリーンな方法があるかどうか知りたいですか?

ちなみに私はLinuxを使っています。

4

10 に答える 10

79

シグナル番号6(Linuxの場合)を上げることはそれを行う1つの方法です(ただし、すべてのPOSIX実装SIGABRTでSIGABRTが6である必要SIGABRTはないことに注意してください。したがって、これがquick'n以外の場合は、値自体を使用することをお勧めします。 'ダーティデバッグコード)。

#include <signal.h>
: : :
raise (SIGABRT);

呼び出すabort()とコアダンプも発生します。子のみで呼び出した後に呼び出すことで、プロセスを終了せずにこれを行うこともできます。詳細については、この回答を参照してください。fork()abort()

于 2009-06-11T03:24:33.090 に答える
77

数年前、Googleはcoredumperライブラリをリリースしました。

概要

coredumperライブラリをアプリケーションにコンパイルして、実行中のプログラムのコアダンプを終了せずに作成できます。カーネルがマルチスレッドコアファイルをネイティブにサポートしていない場合でも、シングルスレッドとマルチスレッドの両方のコアダンプをサポートします。

Coredumperは、BSDライセンスの条件の下で配布されます。

これは決して完全な例ではありません。それは単にcoredumperAPIがどのように見えるかを感じさせるだけです。

#include <google/coredumper.h>
...
WriteCoreDump('core.myprogram');
/* Keep going, we generated a core file,
 * but we didn't crash.
 */

それはあなたが求めていたものではありませんが、多分それはさらに良いです:)

于 2009-06-11T04:15:07.510 に答える
37

シグナルのマンページにリストされているように、アクションが「core」としてリストされているシグナルは、コアダンプを強制します。いくつかの例は次のとおりです。

SIGQUIT       3       Core    Quit from keyboard
SIGILL        4       Core    Illegal Instruction
SIGABRT       6       Core    Abort signal from abort(3)
SIGFPE        8       Core    Floating point exception
SIGSEGV      11       Core    Invalid memory reference

コアダンプが有効になっていることを確認してください。

ulimit -c unlimited
于 2009-06-11T03:19:33.380 に答える
31
#include <stdlib.h>   // C
//#include <cstdlib>  // C++

void core_dump(void)
{
    abort();
}
于 2009-06-11T03:20:10.743 に答える
11

呼び出す

abort();

関連して、実際のコアダンプなしでバックトレースが必要な場合があり、プログラムの実行を継続できるようにします。glibcbacktrace()およびbacktrace_symbols()関数を確認してください: http ://www.gnu.org/s/libc/ manual / html_node / Backtraces.html

于 2009-06-11T03:24:16.570 に答える
4

kill(2)を使用してシグナルを送信できます。

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);

それで、

kill(getpid(), SIGSEGV);
于 2009-06-11T03:21:49.757 に答える
2

次のようなことを行うのが適切な場合があります。

int st = 0;
pid_t p = fork();

if (!p) {
    signal(SIGABRT, SIG_DFL);
    abort(); // having the coredump of the exact copy of the calling thread
} else {
    waitpid(p, &st, 0); // rip the zombie
}

// here the original process continues to live

この単純なアプローチの問題の1つは、1つのスレッドのみがコアダンプされることです。

于 2012-08-14T19:50:25.077 に答える
0
#include <assert.h>
.
.
.
     assert(!"this should not happen");
于 2009-06-11T16:41:10.837 に答える