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_name
或gdb [program_name] [core.pid]
可以进入gdb模式:
- 在进入gdb后输入
where
并回车,就可以指出是在哪一行被Down掉,在哪个函数内,由谁调用等等。 - 在进入gdb后输入 bt,用bt命令查看backtrace以检查发生程序运行到哪里,来定位core dump的文件->行。
3、多种示例
3.1 batch_size过大导致的
3.2 线程被谋杀, 被谋杀者所在线程会抛出一个异常
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的详细错误原因