web-dev-qa-db-ja.com

C / C ++でプログラムでコアダンプを発生させる方法

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

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

int * crash = NULL;
*crash = 1;

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

ところでLinuxを使用しています。

82
hhafez

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

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

abort()を呼び出すと、コアダンプも発生します。これを行うこともできますwithoutfork()を呼び出してプロセスを終了します子のみでabort()が続きます-詳細については this answer を参照してください。

66
paxdiablo

数年前、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.
 */

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

70
ephemient

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
34
Suvesh Pratapa
#include <stdlib.h>   // C
//#include <cstdlib>  // C++

void core_dump(void)
{
    abort();
}
31

アボート();

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

11
smcameron

コアダンプを生成する別の方法:

$ bash
$ kill -s SIGSEGV $$

Bashの新しいインスタンスを作成し、指定されたシグナルでそれを強制終了します。 $$はシェルのPIDです。そうでない場合、現在のbashを強制終了し、ログアウトされるか、端末が閉じられるか、切断されます。

$ bash 
$ kill -s SIGABRT $$
$ bash
$ kill -s SIGFPE $$
5
Zonk

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

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

そう、

kill(getpid(), SIGSEGV);
4
Eugene Yokota

時々、このような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つのスレッドのみがコアダンプされることです。

2
rka444
 #include <stdio.h>
 #include <stdlib.h>
 int main()
 {
   printf("\n");
   printf("Process is aborting\n");
   abort();
   printf("Control not reaching here\n");
   return 0;
 }

好きな場所でこのアプローチを使用してください:)

1
karthik339
#include <assert.h>
.
.
.
     assert(!"this should not happen");
0
sigjuice