Linux下gment fault的调试

更新时间:2023-05-12 08:41:39 阅读: 评论:0

Linux下的段错误产生的原因及调试方法
简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在
对应的物理内存,尤其常见的是访问0地址.
一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是
由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后
13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运
行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段
以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等
等的信息。一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是
gmentation fault就出现了.
在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的
1)访问系统数据区,尤其是往系统保护的内存地址写数据
最常见就是给一个指针以0地址
2)内存越界(数组越界,变量类型不一致等)访问到不属于你的内存区域解决方法
我们在用C/C++语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的。实际
上,内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难免会在此处犯些
小错误,而通常这些错误又是那么的浅显而易于消除。但是手工“除虫”(debug),往
往是效率低下且让人厌烦的,本文将就"段错误"这个内存访问越界的错误谈谈如何快速定
位这些"段错误"的语句。
下面将就以下的一个存在段错误的程序介绍几种调试方法:
1dummy_function(void)
2{
3unsigned char*ptr=0x00;
4*ptr=0x00;
5}
6
7int main(void)
8{
9dummy_function();
10
11return0;
12}
作为一个熟练的C/C++程序员,以上代码的bug应该是很清楚的,因为它尝试操作地址为
0的内存区域,而这个内存区域通常是不可访问的禁区,当然就会出错了。我们尝试编译
运行它:
xiaosuo@gentux test$./a.out
段错误
果然不出所料,它出错并退出了。
1.利用gdb逐步查找段错误:
这种方法也是被大众所熟知并广泛采用的方法,首先我们需要一个带有调试信息的可执行
程序,所以我们加上“-g-rdynamic"的参数进行编译,然后用gdb调试运行这个新编译的
程序,具体步骤如下:
xiaosuo@gentux test$gcc-g-rdynamic d.c
xiaosuo@gentux test$gdb./a.out
GNU gdb  6.5
Copyright(C)2006Free Software Foundation,Inc.
GDB is free software,covered by the GNU General Public Licen, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type"show copying"to e the conditions.
There is absolutely no warranty for GDB.Type"show warranty" for details.
This GDB was configured as"i686-pc-linux-gnu"...Using host libthread_db library
"/lib/libthread_db.so.1".
(gdb)r
Starting program:/home/xiaosuo/test/a.out
Program received signal SIGSEGV,Segmentation fault.
0x08048524in dummy_function()at d.c:4
4*ptr=0x00;
(gdb)
哦?!好像不用一步步调试我们就找到了出错位置d.c文件的第4行,其实就是如此的简
单。
从这里我们还发现进程是由于收到了SIGSEGV信号而结束的。通过进一步的查阅文档(man
7signal),我们知道SIGSEGV默认handler的动作是打印”段错误"的出错信息,并产生
Core文件,由此我们又产生了方法二。
2.分析Core文件:
Core文件是什么呢?
The default action of certain signals is to cau a process to terminate and
produce a core dump file,a disk file containing an image of the process's memory
at the time of termination.A list of the signals which cau a process to dump
core can be found in signal(7).
以上资料摘自man page(man5core)。不过奇怪了,我的系统上并没有找到core文件。
后来,忆起为了渐少系统上的拉圾文件的数量(本人有些洁癖,这也是我喜欢Gentoo的
原因之一),禁止了core文件的生成,查看了以下果真如此,将系统的core文件的大小
限制在512K大小,再试:
xiaosuo@gentux test$ulimit-c
xiaosuo@gentux test$ulimit-c1000
xiaosuo@gentux test$ulimit-c
1000
xiaosuo@gentux test$./a.out

本文发布于:2023-05-12 08:41:39,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/887176.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:内存   错误   访问   程序   文件
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图