下载此beplayapp体育下载

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


beplayapp体育下载分类:bepaly下载苹果 | 页数:约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 ) ,往往是效率低下且让人厌烦的,本文将就" 段错误" 这个内存访问越界的错误谈谈如何快速定位这些" 段错误"的语句。下面将就以下的一个存在段错误的程序介绍几种调试方法: 1 dummy_function (void) 2{3 unsigned char *ptr = 0x00; 4 *ptr = 0x00; 5}67 int main (void) 8{9 dummy_function (); 10 11 return 0; 12} 作为一个熟练的 C/C++ 程序员,以上代码的 bug 应该是很清楚的,因为它尝试操作地址为 0 的内存区域,而这个内存区域通常是不可访问的禁区,当然就会出错了。我们尝试编译运行它: ******@gentux test $ ./ 段错误果然不出所料,它出错并退出了。 1. 利用 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 e to change it and/or distribute copies

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

相关beplayapp体育下载 更多>>
非法内容举报中心
beplayapp体育下载信息
  • 页数6
  • 收藏数0收藏
  • 顶次数0
  • 上传人xxj16588
  • 文件大小0 KB
  • 时间2016-05-05