1、问题描述

在这里插入图片描述
或出现:
在这里插入图片描述

2、关于Core Dump的分析

2.1 什么是Core Dump

  • Core的意思是内存, Dump的意思是扔出来, 堆出来。在开发(或使用)一个程序时,有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped)。虽然系统没事,但我们下次仍可能遇到相同的问题。这时候可以查看一下有没有形如core.PID的core文件生成,这个文件便是操作系统把程序down掉时的内存内容扔出来生成的,让我们或是 debugger 做为参考。这个动作就叫作 core dump。
  • core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump。简而言之,进程异常终止,进程用户空间的数据就会被写到磁盘

2.2 为何有时程序Down了,却没生成 Core文件。

  • 有时候程序down了, 不像编译错误一样会提示到文件一行,而是没有任何信息。一种办法是用gdb的step(linux下调试工具gdb是很强大的调试器), 一步一步寻找,但要step一个上万行的代码让人难以想象。 我们还有更好的办法,这就是core file。
  • 但是core文件却没有生成,这是因为core.PID的core文件的生成跟你当前系统的环境设置有关系,系统默认core文件的大小为0(注意core file size (blocks, -c) 0 这行,这表示的是分配给core文件的长度(单位为字节,一个块的大小要分系统而定了),为0肯定是不得行的,那就修改之
    在这里插入图片描述
  • 则需要用ulimit命令查看和修改core文件的大小,使用ulimit -a查看大小,使用 ulimit -c unlimited表示对core文件不做限制 或 使用ulimit -c 1024 对core文件分配1024个字节。
    在这里插入图片描述
  • 然后再运行程序便成生成core.PID的core文件(core文件生成的位置一般和运行程序的路径相同, 文件名一般为core.进程号)。

2.3 如何使用core文件?

发生core dump之后,使用gdb查看core文件的内容, 以定位文件中引发core dump的行,在在Linux下,查看core文件中的出错堆栈信息有二种方式,使用:gdb -c core.pid program_namegdb [program_name] [core.pid]可以进入gdb模式:

  • 在进入gdb后输入where并回车,就可以指出是在哪一行被Down掉,在哪个函数内,由谁调用等等。
  • 在进入gdb后输入 bt,用bt命令查看backtrace以检查发生程序运行到哪里,来定位core dump的文件->行。

3、多种示例

3.1 batch_size过大导致的

Aborted(core dumped)

3.2 线程被谋杀, 被谋杀者所在线程会抛出一个异常

Cancellation & C++ Exception

3.3 关于 pure virtual method called terminate called without an active exception 解决方案

对于多线程的程序,这个错误的主要原因是当前对象已经被销毁或者正在被销毁,但是其又在被调用,导致了冲突。

3.4 pure virtual method called

记录一个编写多线程程序时遇到的运行时错误:pure virtual method called

起因是写了一个多线程基类,里面有一个纯虚函数run,子类继承了这个run,重点就在纯虚函数上,因为是在基类中构造时创建的线程,线程创建后直接运行run函数,而这时子类尚未构造,所以run函数此时依旧是纯虚函数,就会出现pure virtual method called这个错误而终止运行,感谢http://bbs.csdn.net/topics/340224117这个帖子里的大神们

参考1:什么是Core Dump?
参考2:Segmentation fault (core dumped)的解决办法
参考3:关于Segmentation fault (core dumped)几个简单问题
参考4:关于core文件
参考5:ubuntu查看core dumped的详细错误原因

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐