linux应用编程笔记(2)core dump分析内核链表使用后free出现的错误
来源:互联网 发布:winxp网络共享设置 编辑:程序博客网 时间:2024/05/29 19:54
摘要:介绍了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开始写,就不会有这个错误了,导致我后面数组操作越界了。正确的输出信息如下:
这篇帖子就总结到这里吧,如有不正确的地方,还请指出,大家共同进步。
- linux应用编程笔记(2)core dump分析内核链表使用后free出现的错误
- Linux 下的Debug - 内核转储(core dump)
- Linux使用笔记: 定制core dump文件的文件名
- linux core dump使用
- 【已解决】Linux下出现Segmentation Fault(core dump)错误
- [转]【已解决】Linux下出现Segmentation Fault(core dump)错误
- linux下core dump文件的使用
- linux下C编程free()时出现飘忽诡异的段错误(核心已转储)问题
- linux下C编程free()时出现飘忽诡异的段错误(核心已转储)问题
- Linux core dump的调试技术(2)
- Linux 下的Core dump (一)
- Linux下的core dump(二)
- linux下的代码错误调试技能-core dump
- 【吃一堑】vector的pop_back使用错误造成的core dump
- (转载)core dump的使用
- Linux core dump在Android上的应用
- Linux X11 远程启图形界面core dump问题的分析
- Linux上Core Dump文件的形成和分析
- css
- Unity3D中数学知识之【1】:SmoothDamp平滑阻尼
- 开发google浏览器chrome的JS插件
- LayoutParams继承于Android.View.ViewGroup.LayoutParams.
- BITMAP位图 调色板
- linux应用编程笔记(2)core dump分析内核链表使用后free出现的错误
- 自学 写过的东西
- 第七章:table单元格的选择和UIAlertController
- Session机制详解
- ie 兼容性处理部分资料
- 博客提纲
- 对AUC的理解
- 类的函数调用——总结 某东 面试
- iOS-Core-Animation-Advanced-Techniques(四-4)