调试技巧#1-coredump

         经常和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**,顺顺利复现

问题:

1.关于gdb调试core文件总是一堆问号的问题

2.https://blog.csdn.net/qq_38790716/article/details/85107405

3.https://www.cnblogs.com/hazir/p/linxu_core_dump.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值