如何以编程方式在 C/C++ 中引发核心转储
- 2024-10-25 08:42:00
- admin 原创
- 52
问题描述:
我想在我的 C++ 应用程序的特定位置强制进行核心转储。
我知道我可以通过以下方式做到这一点:
int * crash = NULL;
*crash = 1;
但我想知道是否有更清洁的方法?
顺便说一下,我正在使用 Linux。
解决方案 1:
提高信号编号 6(SIGABRT
在 Linux 中)是一种方法(但请记住,在所有 POSIX 实现中 SIGABRT 并不要求SIGABRT
为 6,因此如果这不是 quick'n'dirty 调试代码,您可能希望使用该值本身)。
#include <signal.h>
: : :
raise (SIGABRT);
调用abort()
也会导致核心转储,您甚至可以在不终止进程的情况下通过仅在子进程中fork()
调用来执行此操作 - 有关详细信息,请参阅此答案。abort()
解决方案 2:
几年前,Google 发布了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. */
这不是你想要的,但也许更好:)
解决方案 3:
如信号手册页所列,任何带有“核心”操作的信号都将强制进行核心转储。以下是一些示例:
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
解决方案 4:
#include <stdlib.h> // C
//#include <cstdlib> // C++
void core_dump(void)
{
abort();
}
解决方案 5:
调用
abort();
相关的,有时您想要一个没有实际核心转储的回溯跟踪,并允许程序继续运行:查看 glibc backtrace() 和 backtrace_symbols() 函数:
http ://www.gnu.org/s/libc/manual/html_node/Backtraces.html
解决方案 6:
生成核心转储的另一种方法:
$ bash
$ kill -s SIGSEGV $$
只需创建一个新的 bash 实例并用指定的信号将其杀死即可。这$$
是 shell 的 PID。否则,您将杀死当前的 bash,并将被注销、终端关闭或断开连接。
$ bash
$ kill -s SIGABRT $$
$ bash
$ kill -s SIGFPE $$
解决方案 7:
您可以使用kill(2)发送信号。
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
所以,
kill(getpid(), SIGSEGV);
解决方案 8:
有时做这样的事情可能是合适的:
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
这种简单方法的一个问题是只有一个线程会被核心转储。
解决方案 9:
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("
");
printf("Process is aborting
");
abort();
printf("Control not reaching here
");
return 0;
}
无论你想用什么方法都可以:)
解决方案 10:
#include <assert.h>
.
.
.
assert(!"this should not happen");
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件