我想在我的C ++应用程序中的特定位置强制进行核心转储。
我知道我可以通过执行以下操作来做到这一点:
int * crash = NULL;
*crash = 1;
但是我想知道是否有更清洁的方法?
我正在使用Linux。
我想在我的C ++应用程序中的特定位置强制进行核心转储。
我知道我可以通过执行以下操作来做到这一点:
int * crash = NULL;
*crash = 1;
但是我想知道是否有更清洁的方法?
我正在使用Linux。
Answers:
提高信号号6(SIGABRT
在Linux中)是一种方法(尽管请记住,并非所有POSIX实现中SIGABRT都必须为6,因此,SIGABRT
如果不是quick'n,则可能需要使用值本身'脏调试代码)。
#include <signal.h>
: : :
raise (SIGABRT);
调用abort()
也会导致核心转储,你甚至可以做到这一点,而不通过调用终止你的过程fork()
,然后abort()
在孩子-见这个答案的详细信息。
ulimit -c unlimited
来自Suvesh Pratapa答案的提示对这个答案很有帮助。
几年前,谷歌发布了coredumper库。
总览
可以将coredumper库编译为应用程序,以创建正在运行的程序的核心转储-无需终止。即使内核本身不支持多线程核心文件,它也支持单线程和多线程核心转储。
Coredumper根据BSD许可的条款进行分发。
例
这绝不是一个完整的例子。它只是让您对coredumper API的外观有所了解。
#include <google/coredumper.h> ... WriteCoreDump('core.myprogram'); /* Keep going, we generated a core file, * but we didn't crash. */
这不是您要的,但是也许更好:)
如信号手册中所列,任何动作列为“核心”的信号都会强制进行核心转储。一些例子是:
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();
相关的,有时您想要没有实际核心转储的回溯,并允许程序继续运行:检查glibc backtrace()和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 $$
bash -c 'kill -SIGSEGV $$'
。
#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");