C++アプリケーションの特定の場所でコアダンプを強制的に実行したいと思います。
私は次のようなことをすることでそれができることを知っています:
int * crash = NULL;
*crash = 1;
しかし、よりクリーンな方法があるかどうか知りたいですか?
ところでLinuxを使用しています。
シグナル番号6(LinuxではSIGABRT
)を上げることがこれを行う1つの方法です(ただし、SIGABRTはrequiredではないことに留意してください)すべてのPOSIX実装で6であるため、quick'n'dirtyデバッグコード以外の場合は、SIGABRT
値自体を使用することもできます)。
#include <signal.h>
: : :
raise (SIGABRT);
abort()
を呼び出すと、コアダンプも発生します。これを行うこともできますwithoutfork()
を呼び出してプロセスを終了します子のみでabort()
が続きます-詳細については this answer を参照してください。
数年前、Googleは coredumper ライブラリをリリースしました。
概要
Coredumperライブラリをアプリケーションにコンパイルして、実行中のプログラムのコアダンプを作成します(終了することはできません)。カーネルがマルチスレッドコアファイルをネイティブにサポートしていない場合でも、シングルスレッドとマルチスレッドの両方のコアダンプをサポートします。
Coredumperは、BSDライセンスの条件の下で配布されます。
例
これは決して完全な例ではありません。それは単に、コアダンプAPIがどのように見えるかの感覚を与えます。
#include <google/coredumper.h> ... WriteCoreDump('core.myprogram'); /* Keep going, we generated a core file, * but we didn't crash. */
それはあなたが求めていたものではありませんが、多分それはもっと良いです:)
signal manpage にリストされているように、 '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();
}
アボート();
関連して、実際のコアダンプなしでバックトレースを行い、プログラムの実行を継続できるようにする場合があります。glibcbacktrace()およびbacktrace_symbols()関数をチェックアウトします。 http://www.gnu.org/ s/libc/manual/html_node/Backtraces.html
コアダンプを生成する別の方法:
$ bash
$ kill -s SIGSEGV $$
Bashの新しいインスタンスを作成し、指定されたシグナルでそれを強制終了します。 $$
はシェルのPIDです。そうでない場合、現在のbashを強制終了し、ログアウトされるか、端末が閉じられるか、切断されます。
$ bash
$ kill -s SIGABRT $$
$ bash
$ kill -s SIGFPE $$
kill(2) を使用してシグナルを送信できます。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
そう、
kill(getpid(), SIGSEGV);
時々、このようなsmthを行うことが適切な場合があります。
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 <stdio.h>
#include <stdlib.h>
int main()
{
printf("\n");
printf("Process is aborting\n");
abort();
printf("Control not reaching here\n");
return 0;
}
好きな場所でこのアプローチを使用してください:)
#include <assert.h>
.
.
.
assert(!"this should not happen");