有时当我运行代码时,当我通过 Ctrl + \ 终止程序时会生成核心转储文件。文件名的格式为core.*
。该程序没有突然终止,并且没有分段错误。我认为它是SIGQUIT
而不是SIGABRT
或SIGSEGV
。如果我尝试 Ctrl + C 或 Ctrl + Z ,则不会生成它。
任何人都可以告诉为什么只有在按下 Ctrl + \ 时才生成它?如何避免生成此核心转储文件?核心转储文件有用吗?
答案 0 :(得分:22)
由于程序中的错误,进程在操作系统终止时转储核心。发生这种情况的最典型原因是程序访问了无效的指针值。鉴于您有偶发转储,很可能您使用的是未初始化的指针。
您可以发布导致错误的代码吗?除了模糊的概括之外,如果没有实际看到代码,很难猜出是什么问题。
至于核心转储实际上是什么,请查看这篇维基百科文章:
答案 1 :(得分:12)
正如其他人所说,在核心转储是程序错误的结果之前。
您可以配置是否使用ulimit命令生成核心转储。输入
ulimit -c 0
禁用活动shell中的核心文件生成。
如果生成核心的程序是使用符号信息构建的,则可以执行post mortem debugging session这样的操作:
gdb <pathto/executable> --core <corefilename>
答案 2 :(得分:8)
当进程收到某些信号(例如SIGSEGV)时会生成核心转储,内核在访问其地址空间之外的内存时会发送该信号。通常,这是因为指针的使用方式错误。这意味着程序中存在错误。
核心转储对于查找错误非常有用。它是问题发生时进程内存的映像,因此可以使用gdb之类的调试器来查看程序正在执行的操作。调试器甚至可以访问(有时)程序中变量的值。
您可以使用ulimit命令阻止核心转储。
答案 3 :(得分:7)
ctrl + \ 将信号SIGQUIT发送到进程。根据POSIX.1标准,此信号的默认操作是生成核心。
SIGILL,SIGABRT,SIGFPE,SIGSEGV是系统生成核心的其他情况。
有关详细信息,请参阅系统中的“man 7 signal”。
答案 4 :(得分:6)
这是一个帮助调试行为不当的应用程序的工具。它很大,因为它包含了它死亡时所有应用程序物理内存的内容以及所有线程的寄存器状态和堆栈。
当内核杀死应用程序以执行某些恶意操作时会生成它们,例如生成分段违例或总线错误。
答案 5 :(得分:2)
您可以通过编写不崩溃的代码来避免创建核心转储文件:)
说真的,核心转储非常有用,因为你可以看到程序在崩溃时的状态,以便进行“事后”调试。您可以在gdb中打开它们并检查程序的状态(特别是如果它是通过调试构建的)。
如果程序有一个SIGSEGV(通常由无效指针解除引用引起),SIGABRT(如果你调用abort()会发生这种情况,或者在C ++中由默认的terminate()处理函数用于析构函数中的异常等),通常会产生核心转储。 )或其他一些错误。您也可以使用调试器或以编程方式显式触发它们。
如果您已修复所有错误并且它是完美的,您可以删除它们。此外,如果您以任何方式更改了程序(并重新编译),那么它们将变得无用,因为调试信息现在将与核心转储中的内容不匹配,因此您也可以删除它们。
答案 6 :(得分:1)
Ctrl + \ 的目的是生成核心转储。这是SIGQUIT
的作用。如果您不想生成它,请改用 Ctrl + C (SIGINT
)。如果有问题的程序没有响应SIGINT
,但你需要从终端中删除它,你或者开发人员都做错了。
使用 Ctrl + C 设计的不从终端中被杀死的程序仍应正常响应SIGTERM
,这可以通过kill -TERM ...
在另一个终端触发。如果一切都失败了,SIGKILL
将迫使立即终止。