C ++アプリケーションの特定の場所にコアダンプを強制したいのですが。
私は次のようなことでそれを行うことができることを知っています:
int * crash = NULL;
*crash = 1;
しかし、よりクリーンな方法があるかどうか知りたいですか?
ちなみにLinuxを使っています。
C ++アプリケーションの特定の場所にコアダンプを強制したいのですが。
私は次のようなことでそれを行うことができることを知っています:
int * crash = NULL;
*crash = 1;
しかし、よりクリーンな方法があるかどうか知りたいですか?
ちなみにLinuxを使っています。
回答:
シグナル番号6の発生(SIGABRT
Linuxの場合)はそれを行う1つの方法です(ただし、すべてのPOSIX実装でSIGABRTが6である必要はないのでSIGABRT
、quick'n以外の場合は値自体を使用することもできます'ダーティデバッグコード)。
#include <signal.h>
: : :
raise (SIGABRT);
呼び出すabort()
とコアダンプも発生します。これを行うには、子だけで呼び出し、fork()
その後に続けてabort()
、プロセスを終了する必要はありません。詳細については、この回答を参照してください。
ulimit -c unlimited
Suvesh Pratapaの回答からのヒントは、この回答の助けとなりました。
数年前、Googleはコアダンプライブラリをリリースしました。
概観
coredumperライブラリをアプリケーションにコンパイルして、終了せずに実行中のプログラムのコアダンプを作成できます。カーネルがマルチスレッドのコアファイルをネイティブでサポートしていない場合でも、シングルスレッドとマルチスレッドの両方のコアダンプをサポートします。
コアダンプは、BSDライセンスの条件に基づいて配布されます。
例
これは完全な例ではありません。コアダンプAPIがどのように見えるかを感じさせるだけです。
#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
setrlimit(RLIMIT_CORE, &core_limits);
介してを使用できます#include <sys/resource.h>
。タイプの構造体を作成しrlimit
、rlim_cur
およびrlim_max
メンバーを設定します。
#include <stdlib.h> // C
//#include <cstdlib> // C++
void core_dump(void)
{
abort();
}
abort()
直接電話しないのですか?
呼び出す
abort();
関連して、実際のコアダンプなしでバックトレースが必要な場合があり、プログラムの実行を続行できます。glibcbacktrace()およびbacktrace_symbols()関数を確認してください:http : //www.gnu.org/s/libc/ manual / html_node / Backtraces.html
コアダンプを生成する別の方法:
$ bash
$ kill -s SIGSEGV $$
bashの新しいインスタンスを作成し、指定されたシグナルでそれをkillするだけです。$$
シェルのPIDです。それ以外の場合は、現在のbashを強制終了し、ログアウト、ターミナルが閉じられるか切断されます。
$ bash
$ kill -s SIGABRT $$
$ bash
$ kill -s SIGFPE $$
bash -c 'kill -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 <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");