没有合适的资源?快使用搜索试试~ 我知道了~
Linux环境下段错误(Segmentation fault)的产生原因及调试方法
4星 · 超过85%的资源 需积分: 43 177 下载量 16 浏览量
2013-05-21
14:16:23
上传
评论 8
收藏 41KB DOCX 举报
温馨提示
试读
11页
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页未读,继续阅读
资源评论
- wuzen0070072014-05-05还可以,具体问题还是要做代码分析比较好
- mdxz12292017-03-09比较好的方法描述,但如果在整理一下会更好! 感谢分享!
bailiju
- 粉丝: 18
- 资源: 89
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功