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

Cha*_*hra 15 linux coredump

有时当我运行我的代码时,当我通过Ctrl+ 终止程序时会生成核心转储文件\.文件名是表单的名称core.*.该程序没有突然终止,并且没有分段错误.我相信它是,SIGQUIT而不是SIGABRTSIGSEGV.如果我尝试Ctrl+ C,或Ctrl+ Z,则不会生成.

任何人都可以告诉为什么只有在按下Ctrl+ 时才生成它\?如何避免生成此核心转储文件?核心转储文件有用吗?

Jar*_*Par 24

由于程序中的故障,进程在操作系统终止时转储核心.发生这种情况的最典型原因是程序访问了无效的指针值.鉴于您有偶发转储,很可能您使用的是未初始化的指针.

你能发布造成错误的代码吗?除了模糊的概括之外,如果没有实际看到代码,很难猜出是什么问题.

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

  • 在Linux中,Ctrl + \会导致核心转储,即使程序没有故障并且在终止时运行正常. (7认同)

lot*_*har 12

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

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

ulimit -c 0
Run Code Online (Sandbox Code Playgroud)

禁用活动shell中的核心文件生成.

如果生成核心的程序是使用符号信息构建的,则可以执行如下所示的事后调试会话:

gdb <pathto/executable> --core <corefilename>
Run Code Online (Sandbox Code Playgroud)


小智 8

当进程接收到某些信号时会生成核心转储,例如SIGSEGV,内核在访问其地址空间之外的内存时会发送该信号.通常,这是因为指针的使用方式错误.这意味着程序中存在错误.

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

您可以使用ulimit命令阻止核心转储的发生.


Onk*_*kar 7

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

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

有关详细信息,请参阅系统中的"man 7 signal".


Jas*_*oco 6

它是一个帮助调试行为不当的应用程序的工具.它很大,因为它包含了它死亡时所有应用程序物理内存的内容以及所有线程的寄存器状态和堆栈.

当内核杀死应用程序执行某些恶意操作时会生成它们,例如生成分段违例或总线错误.