C++アプリケーションの特定の場所にコアダンプを強制したいと思います。
私は次のようなことをすることでそれができることを知っています:
int * crash = NULL;
*crash = 1;
しかし、もっとクリーンな方法があるかどうか知りたいですか?
ちなみに私はLinuxを使っています。
シグナル番号6(Linuxの場合)を上げることはそれを行う1つの方法です(ただし、すべてのPOSIX実装SIGABRT
でSIGABRTが6である必要SIGABRT
はないことに注意してください。したがって、これがquick'n以外の場合は、値自体を使用することをお勧めします。 'ダーティデバッグコード)。
#include <signal.h>
: : :
raise (SIGABRT);
呼び出すabort()
とコアダンプも発生します。子のみで呼び出した後に呼び出すことで、プロセスを終了せずにこれを行うこともできます。詳細については、この回答を参照してください。fork()
abort()
数年前、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. */
それはあなたが求めていたものではありませんが、多分それはさらに良いです:)
シグナルのマンページにリストされているように、アクションが「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
#include <stdlib.h> // C
//#include <cstdlib> // C++
void core_dump(void)
{
abort();
}
呼び出す
abort();
関連して、実際のコアダンプなしでバックトレースが必要な場合があり、プログラムの実行を継続できるようにします。glibcbacktrace()およびbacktrace_symbols()関数を確認してください: http ://www.gnu.org/s/libc/ manual / html_node / Backtraces.html
kill(2)を使用してシグナルを送信できます。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
それで、
kill(getpid(), SIGSEGV);
次のようなことを行うのが適切な場合があります。
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つのスレッドのみがコアダンプされることです。
#include <assert.h>
.
.
.
assert(!"this should not happen");