linux coredump调试

linux coredump调试

一、概念

coredump:

Coredump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快照。操作系统在程序发生异常而异常在进程内部又没有被捕获的情况下,会把进程此刻内存、寄存器状态、运行堆栈等信息转储保存在一个文件里。

该文件也是二进制文件,可以使用gdb、elfdump、objdump或者windows下的windebug、solaris下的mdb进行打开分析里面的具体内容。

三、产生原因

1.内存访问越界

a) 由于使用错误的下标,导致数组访问越界

b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符

c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

2 多线程程序使用了线程不安全的函数。

3 多线程读写的数据未加锁保护。对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump

4 非法指针

a) 使用空指针

b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump.

三、设置

1.查看core文件存储位置

2.修改core位置

可以通过修改kernel的参数来指定内核生成的coredump文件的文件名。常见设置如下:

在这条命令中,/data/coredump是你自己指定的存放coredump文件的路径,所有产生的coredump文件将会存放在这里,%e表示程序的文件名,%p表示进程的ID(当然还有一些其他的参数可以设置,例:%t显示创建的时间),但是前提要把目录/data/coredump创建好,不然无法生成文件

%E:程序文件的完整路径(路径中的/会被!替代)

%p:进程 ID

%t:进程奔溃的时间戳

%s:哪个信号让进程奔溃

3.修改core文件大小

linux系统默认生成core文件时空,可以用命令查看

以上修改只对当前的shell有效,一旦关闭,则恢复原来的值

四、实践

readelf -h 读取coredump文件头,判断是不是core文件

程序:test2.cpp

编译:

运行:

结果:

调试:

我们发现在相应的目录下出现了core文件,我们用这个core文件来调试一下

我们使用where或者bt查看一下堆栈信息:

我们会发现出现了相关的调试信息看,我们顺着去查看一下代码就大概知道问题所在了;

其实好多linux调试技巧需要我们慢慢发现实践,这样才能不断进步,程序出现问题,我们也能很快找到问题所在;

GDB命令参考:

想了解学习更多C++后台服务器方面的知识,请关注:

微信公众号:C++后台服务器开发

————————————————

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191221A0Q7BP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券