Linux-怎么定位segment fault(段错误)?
最近开发了个linux下的C程序,每次运行过程中都会无规律地报segment fault错误,有没有什么好的方式定位出错的原因?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
最近开发了个linux下的C程序,每次运行过程中都会无规律地报segment fault错误,有没有什么好的方式定位出错的原因?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(9)
可以参考下这个问题的答案:@VC开发中如何检测堆栈被破坏?
用gdb分析core文件,缩小范围,必要时加点日志
错误是由于内存管理单元(负责支持虚拟内存的硬件)的异常所导致,就是跟Windows下提示的内存非法操作一样,是由于指针或者其他方式的内容从访问出来问题。一般来说,这种方式可以编译成带调试符号程序,用GDB调试就可以发现错误的位置。
确实内存越界是主要原因,数组下标越界,指针非法访问,都可能导致这种错误。
一般的工具估计也只能定位倒二进制的地址。配合一定的编译器选项,查看事发的调用堆栈。
应该会有所帮助。
http://blog.sina.com.cn/s/blog_4c3474270100x5lk.html
可以参考下这篇文章。
http://wenku.baidu.com/view/310242e69b89680203d82599.html
这篇文章,讲的不错,值得读一读:)
刚开始讲的数据段、代码段、gdt啥的,不用管
简单的理解就是,当前程序访问的段,
并没有跟系统申请,或者是权限不够 非法访问
当然 这种理解不够专业 呵呵
文章中说的,常见是两种情况比较普遍
1.空指针
例如:*p = NULL 直接使用这种
2.内存越界
例如:数组下标、变量类型不一致
文章提供一个抓取这种错误的方法
好像是信号SIGSEGV挂handler, 我是linux初学者...
一般是访问到了一个不存在的指针,堆栈溢出,或者数组越界之类的。
gdb和valgrind都非常适合定位segfault。前者适合准确定位出现segfault的位置并且进行debug,后者适合检查在出现segfault之前有没有其他内存方面的未显露出来的问题。
无规律报错说明调用堆栈被修改了, 数组越界是最大的主因,看看你的memset数组或直接用index设置数组是否有越界检查。