经常和linux开发程序,不免会遇到程序发生segement fault 错误,特别是运行一段时间后的程序发生这样的错错误,这个时候gdb实时运行可能就不太合适,这个时候使用core文件是比较合适的,core文件是coredump,又称又称为核心转储,它是操作系统进程在接受到信号发生终止时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。coredump
文件含有当进程被终止时内存、CPU寄存器和各种函数调用堆栈信息等,方便开发人员复现问题。下面从几个方面来谈coredump;
1coredump原因
总结如下:
1.内存访问越界
具体原因可能是:
- 由于使用错误下标,导致数组访问越界
- 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
- 使用strcpy,strcat,sprintf等字符串操作函数时,容易出现读写越界的情况
2.多线程程序使用了线程不安全的函数
3.多线程读写的数据未枷锁保护
4.非法指针、包括使用空指针或随意使用指针转换
5.堆栈溢出
2.coredump设置
设置coredump的大小,设置为0,说明不产生coredump文件
//当前有效的修改
ulimit -c [size] //这里size一般修改为unlimited
//可以使用ulimit -a访问详细信息
ulimit -a
这个是临时方案,重启将会失效,所以将改语句写入/etc/profile,然后source /etc/profile或者重启生效。
设置文件core存放目录:
-
默认生成的 core 文件保存在可执行文件所在的目录下,文件名就为
core
。 -
通过修改
/proc/sys/kernel/core_uses_pid
文件可以让生成 core 文件名是否自动加上 pid 号。
例如echo 1 > /proc/sys/kernel/core_uses_pid
,生成的 core 文件名将会变成core.pid
,其中 pid 表示该进程的 PID。 -
还可以通过修改
/proc/sys/kernel/core_pattern
来控制生成 core 文件保存的位置以及文件名格式。
例如可以用echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern
设置生成的 core 文件保存在 “/tmp/corefile” 目录下,文件名格式为 “core-命令名-pid-时间戳”,这里罗列几种:
%p 出Core进程的PID
%u 出Core进程的UID
%s 造成Core的signal号
%t 出Core的时间,从1970-01-0100:00:00开始的秒数
%e 出Core进程对应的可执行文件名
3.coredump例子:
使用步骤:
1.编译源文件的时候加入-g,调试选项
2.按照上面步骤设置coredump, 以使程序异常终止时能生成 core 文件
ulimit -c unlimited
3.生成的coredump后,使用命令 gdb program core
来查看 core 文件,其中 program 为可执行程序名,core 为生成的 core 文件名。
代码如下:
main.cpp如下
#include <stdio>
int main()
{
int b = 1;
int* a=NULL;
*a = b;
return 0;
}
将残剩core文件,直接将gdb ./main core**,顺顺利复现
问题:
2.https://blog.csdn.net/qq_38790716/article/details/85107405