linux应用编程笔记(2)core dump分析内核链表使用后free出现的错误

摘要:介绍了core dump的功能,使用方法和步骤,最后用其分析了访问空指针,只读内存以及内核链表使用中出现的错误。


一、core dump是什么

    coredump又叫做核心转存,当程序在运行中出现错误的时候,发生异常,linux系统可以把出错时候的内容存储在一个core文件中,这个过程就叫做core dump。我们在有了这个文件之后,再联合gdb,可以找出错误,节省了人力和成本。

    coredump主要用来处理段错误segment fault,主要是以下几种类型:

    1.数组访问越界

    2.访问空指针

    3.栈溢出

    4.修改只读内存


二、core dump使用步骤

    第一步:打开core dump:ulimit –c unlimited

                   关闭core dump:ulimit –c 0

    第二步:当程序发生错误了,就会产生一个core dump文件,就可以使用gdb去找出出错的地方,方法为:gdb程序名 core文件名,以test.c为例,编译生成的可执行文件test:gdb ./test test.core


三、core dump分析访问空指针

    测试程序如下:

<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
 
void main()
{       
   int *ptr = NULL;      
   
   *ptr = 0;
}</span>

    这里编译的时候不会报错,但是要注意在编译的时候加上-g选项,不然后面使用gdb调试比较麻烦,运行之后会出现段错误,文件下面会出现一个core.963的文件,使用下面的命令:

    #gdb ./seg1 core.963

    这时候就会输出有用的信息了,如下:

    提示在第八行,有一个段错误。


四、core dump分析修改只读内存

    测试程序如下:

<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
void main()
{       
    char *ptr = "123456";   
       ptr[0] = '7';
}</span>

    这里因为定义了一个字符串常量的指针,第二行想给这个常量赋值,显然是错误的,因为常量是只读的。

    同样,编译的时候加上-g选项,很重要,然后运行出错,出现了一个core.1302的文件,然后我们输入下面的指令:

    #gdb ./seg2 core.1302

    这时候会输出错误信息,如下:

    说算错误发生在第八行,这个赋值是错误的。


五、分析内核链表free时出现的错误

    还记得前面的帖子,要在应用程序中移植内核链表,内核链表的操作本身并没有错误,创建,添加,遍历,删除,但是最后free的时候,出现了错误。使用gcc –g重新编译,运行,这里有一个core文件,拿到这边来分析下。具体错误如下:

   

    说实话,看到这些我有点晕,backtrace给出的提示我理解的是在listapp中调用了libc.so.6这个库里面的一个函数,然后在这个函数的某个位置,出现了错误,下面给出了一个memory map,这个是存储器映射信息?然后我使用gdb调试,输出如下信息:

    说错误在__kernel_vsyscall里面,这个函数是干嘛的,看名字应该是和系统调用有关的,反汇编出来的结果是这个函数调用了sysenter,而sysenter又调用了sysenter_do_call,最终去查找系统调用表。那问题肯定出在free这里,应该是我前面往数组写的时候越界了,导致free失败,但是哪里越界了呢,肯定是malloc的时候空间给小了,或者我写到不知道什么别的地方去了?能力有限,只能去修改源程序,不能在这里继续深入查找了。

    后来只在源程序里改了一个数字,就是下面这两行:

    pmember=malloc(sizeof(structmember)*5);

    memset(pmember,0,sizeof(structmember)*5);

    原本这里是4,我多分配了一些空间,程序编译之后,运行,完全正确,没有段错误了!后来想想为什么呢?因为我在for循环里面,使用了i+1,当初为什么要使用i+1呢?自己也记不清了,似乎因为下标是从1开始的,如果从0开始写,就不会有这个错误了,导致我后面数组操作越界了。正确的输出信息如下:

   

    这篇帖子就总结到这里吧,如有不正确的地方,还请指出,大家共同进步。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值