之前调试程序出现“segmentation fault”,即为常见的段错误。查了些资料,做个总结吧。
产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其是常见的访问0地址。
在编程中以下几类做法容易导致段错误,基本是错误的使用指针引起的:
1)访问系统数据区,尤其是往系统保护的内存地址写数据;
最常见就是给一个指针为0的地址。
2)内存越界(数据越界,变量类型不一致等)访问到不属于你的内存区域
下面就简单说一种找出段错误的方法:
就是将“段错误”这个内存访问越界的错误谈谈如何快速定位这些“段错误”的语句。
举个例子,这个也是我之前用过的,比较靠谱的一种。
function(void)
{
unsigned char *ptr = 0x00;
*ptr = 0x00;
}
int main()
{
function();
return 0;
}
由于它尝试操作地址为0的内存区域,而这个内存区域通常是不可访问的禁区,当然就会出错了。那么就利用gdb逐步查找段错误。这种方法也是被大众所熟知并广泛采用的方法,首先我们需要一个带有调试信息的可执行程序,所以加上“ -g -rdynamic”的参数进行编译,然后用gdb调试运行这个新的程序。
具体步骤如下:
>> gcc -g -rdynamic ***.c
>>gdb ./a.out
/*******************************************************/
* 关于gdb的信息就全部省略
*******************************************************/
(gdb) r
…………
4 *ptr = 0x00;
(gdb)
就找到出错位置****.c文件的第4行,如此的简单。