为什么生成核心转储文件?

有时当我运行我的代码时,通过Ctrl + \终止程序时会生成核心转储文件。 文件名的forms是core.* 。 程序没有突然终止,没有分段错误。 我相信这是SIGQUIT而不是SIGABRTSIGSEGV 。 如果我尝试Ctrl + CCtrl + Z ,那么它不会生成。

任何人都可以告诉为什么只有按Ctrl + \时才生成它? 我怎样才能避免生成这个核心转储文件? 有没有用于核心转储文件?

    当程序由于程序错误而被操作系统终止时,进程会转储核心。 发生这种情况的最典型原因是程序访问了一个无效的指针值。 鉴于你有一个零星的转储,很可能你正在使用一个未初始化的指针。

    你能发布导致错误的代码吗? 除了模糊的概括之外,很难在没有看到代码的情况下猜测出什么错误。

    至于核心转储实际上是什么,看看这个维基百科的文章:

    正如其他人所说,核心转储是程序故障的结果。

    您可以配置是否使用ulimit命令生成核心转储。 进入

     ulimit -c 0 

    禁用主动shell中的核心文件生成。

    如果生成核心的程序是用符号信息构建的,那么可以像这样进行事后调试会话 :

     gdb <pathto/executable> --core <corefilename> 

    核心转储是在进程接收到某些信号(如SIGSEGV)时生成的,内核在其地址空间外访问内存时发送它。 通常情况下,这是因为如何使用指针的错误而发生的。 这意味着程序中有一个错误。

    核心转储对于发现错误非常有用。 它是问题发生时进程内存的映像,因此可以使用gdb等调试器来查看程序正在执行的操作。 调试器甚至可以访问(有时)程序中变量的值。

    您可以使用ulimit命令防止发生核心转储。

    这是一个帮助调试表现不佳的应用程序的工具。 这很大,因为它包含所有应用程序物理内存在其死亡时的内容以及所有线程的寄存器状态和堆栈。

    当内核杀死一个邪恶的应用程序,例如生成分割违例或总线错误时,它们会生成。

    ctrl + \发送信号SIGQUIT给进程。 根据POSIX.1标准,此信号的默认操作是生成一个核心。

    SIGILL,SIGABRT,SIGFPE,SIGSEGV是系统生成核心的其他情况。

    有关更多详细信息,请参阅系统中的“man 7 signal”。

    您可以通过编写不会崩溃的代码来避免创建核心转储文件:)

    严重的是,核心转储非常有用,因为您可以在程序崩溃时看到程序的状态,以便进行“事后”调试。 您可以在gdb中打开它们并检查程序的状态(特别是如果它是通过调试构建的)。

    如果程序有一个SIGSEGV(通常是由无效的指针解引用导致的),SIGABRT(如果你调用abort(),或者在C ++中被析构函数中的异常的默认terminate()处理程序等)其他故障。 您也可以使用调试器或编程方式显式触发它们。

    如果你已经修复了所有的错误并且是完美的,你可以删除它们。 另外,如果你以任何方式改变你的程序(并重新编译它),那么它们将变得毫无用处,因为现在的调试信息将不匹配核心转储中的内容,所以你也可以删除它们。

    Ctrl + \的要点是生成一个核心转储。 这就是SIGQUIT所做的。 如果您不想生成它,请改为使用Ctrl + CSIGINT )。 如果有问题的程序没有回应SIGINT但是你需要从终端上杀死它,无论是你还是开发者做错了什么。

    如果程序设计为被终端用Ctrl + C杀死,仍然可以正常回应SIGTERM ,这可以通过kill -TERM ...在另一个终端触发。 如果一切都失败了, SIGKILL将强制立即终止。