没有合适的资源?快使用搜索试试~ 我知道了~
首页Linux环境下段错误(Segmentation fault)的产生原因及调试方法
Linux环境下段错误(Segmentation fault)的产生原因及调试方法

linux开发经常会发生Segmentation fault问题,这是网上看到的一篇博文,共享给大家;有需要的下载。
资源详情
资源评论
资源推荐

Linux
环境下段错误
(Segmentation fault)
的产生原因及
调试方法小结
最近在 Linux 环境下做 C 语言项目,由于是在一个原有项目基础之上进行二次开发,而且
项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段
错误”(Segmentation Fault)。借此机会系统学习了一下,这里对 Linux 环境下的段错误
做个小结,方便以后同类问题的排查与解决。
1. 段错误是什么
一句话来说,段错误是指访问的内存超出了系统给这个程序所设定的内存空间,例如访问
了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。这
里贴一个对于“段错误”的准确定义(参考 Answers.com):
!"###
$
%%&
'(&
)*)+' ,
--(.//*.+'0-'1&

2. 段错误产生的原因
2.1 访问不存在的内存地址
234
234
5
671(008
67#8
9
2.2 访问系统保护的内存地址
234
234
5
676#8
67:##8
9
2.3 访问只读的内存地址
234
234
234
5
67%%8
%-*-%8
9
2.4 栈溢出
234
234
5

8
9
等等其他原因。
3. 段错误信息的获取
程序发生段错误时,提示信息很少,下面有几种查看段错误的发生信息的途径。
3.1 dmesg
dmesg 可以在应用程序 crash 掉时,显示内核中保存的相关信息。如下所示,通过 dmesg
命令可以查看发生段错误的程序名称、引起段错误发生的内存地址、指令指针地址、堆栈
指针地址、错误代码、错误原因等。以程序 2.3 为例:
;<=>?
@ABACDEC#BEFB@AE##F<"#D"D###AC#!
BEA:#:@D###G:B###F
补充示例,testseg.c 为需要测试的代码:
:编译<
A运行<>,提示发生断错误
B运行 ,查看 信息如下:
HHH@A!#!BF<################
##########D##DE#######EII"#!
A运行 A##########D##DE#,输出如下:
HHH>>&&&>&&&>><J
显示在代码的第 J 行发生错误。
3.2 -g
使用 gcc 编译程序的源码时,加上-g 参数,这样可以使得生成的二进制文件中加入可以用
于 gdb 调试的有用信息。以程序 2.3 为例:
;<=>?BB
剩余10页未读,继续阅读


















bailiju
- 粉丝: 17
- 资源: 89
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制

评论2