下载此beplayapp体育下载

Linux下的段错误(Segmentationfault)产生的原因及调试方法(经典).docx


beplayapp体育下载分类:办公beplayapp体育下载 | 页数:约6页 举报非法beplayapp体育下载有奖
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该beplayapp体育下载所得收入归上传者、原创者。
  • 3.下载的beplayapp体育下载,不会出现我们的网址水印。
1 / 6 下载此beplayapp体育下载
beplayapp体育下载列表 beplayapp体育下载介绍
Linux下的段错误(Segmentation fault)产生的原因及调试方法(经典)
2009-04-05 11:25
简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不 存在对应的物理内存,尤其常见的是访问0地址.
一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这
个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指 向的gdt表,后
13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在 cpu中的运行级
别,指向的gdt是由以64位为一个单位的 表,在这张表中就保存着程序运行的代码段以及数据 段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。
一旦一个程序发生了 越界访问,cpu就会产生相应的异常保护,于是 segmentation fault就出
现了 .
在编程中以下几类做法容易导致段错误 ,基本是是错误地使用指针引起的
1) 访问系统数据区,尤其是往 系统保护的内存地址写数据
最常见就是给一个指针以 0地址
2) 内存越界(数组越界,变量类型不一致等 )访问到不属于你的内存区域
解决方法
我 们在用C/C++语言写程序的时侯,内存管理的绝大部分工作都是需要我们来做的。 实际上,
内存管理是一个比较繁琐的工作,无论你多高明,经验多丰富,难 免会在此处犯些小错误,
而通常这些错误又是那么的浅显而易于消除。但是手工 除虫”(debug),往往是效率低下且
让人厌烦的,本文将就"段错误"这个 内存访问越界的错误谈谈如何快速定位这些 "段错误"的
语句。
下面将就以下的一个存在段错误的程序介绍几种调试方法:
dummy_function (void)
(
unsigned char *ptr = 0x00;
*ptr = 0x00;
)
6
int main (void)
(
dummy_function ();
10
return 0;

作为一个熟练的 C/C++程序员,以上代码的 bug应该是很清楚的,因为它尝试操作地址为 0
的内存区域,而这个内存区域通常是不可访问的禁区,当然就会出错了。我们尝试编译运行
它:
******@gentux test $ ./
段错误
果然不出所料,它出错并退出了。
利用gdb逐步查找段错误:
这种方法也是被大众所熟知并广泛采用的方法,首先我们需要一个带有调试信息的可执行程
序,所以我们加上 -g -rdynamic"的参数进行编译,然后用 gdb调试运行这个新编译的程序 ,
具体步骤如下:
******@gentux test $ gcc -g -rdynamic
******@gentux test $ gdb ./
GNU gdb
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distr

Linux下的段错误(Segmentationfault)产生的原因及调试方法(经典) 来自beplayapp体育下载www.apt-nc.com转载请标明出处.

非法内容举报中心
beplayapp体育下载信息
  • 页数6
  • 收藏数0收藏
  • 顶次数0
  • 上传人秋江孤影
  • 文件大小38 KB
  • 时间2021-02-19