如何以编程方式在 C/C++ 中引发核心转储

2024-10-25 08:42:00
admin
原创
206
摘要:问题描述:我想在我的 C++ 应用程序的特定位置强制进行核心转储。我知道我可以通过以下方式做到这一点:int * crash = NULL; *crash = 1; 但我想知道是否有更清洁的方法?顺便说一下,我正在使用 Linux。解决方案 1:提高信号编号 6(SIGABRT在 Linux 中)是一种方法(...

问题描述:

我想在我的 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");
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2606  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1558  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   40  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   38  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   33  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用