Linux-怎么定位segment fault(段错误)?

发布于 2016-12-22 16:29:39 字数 71 浏览 1757 评论 9

最近开发了个linux下的C程序,每次运行过程中都会无规律地报segment fault错误,有没有什么好的方式定位出错的原因?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

瑾兮 2017-09-18 06:03:59

可以参考下这个问题的答案:@VC开发中如何检测堆栈被破坏?

偏爱自由 2017-08-20 00:54:45

用gdb分析core文件,缩小范围,必要时加点日志

归属感 2017-08-15 16:22:32

错误是由于内存管理单元(负责支持虚拟内存的硬件)的异常所导致,就是跟Windows下提示的内存非法操作一样,是由于指针或者其他方式的内容从访问出来问题。一般来说,这种方式可以编译成带调试符号程序,用GDB调试就可以发现错误的位置。

想挽留 2017-07-18 18:56:30

确实内存越界是主要原因,数组下标越界,指针非法访问,都可能导致这种错误。
一般的工具估计也只能定位倒二进制的地址。配合一定的编译器选项,查看事发的调用堆栈。
应该会有所帮助。

归属感 2017-06-08 07:27:11

http://blog.sina.com.cn/s/blog_4c3474270100x5lk.html
可以参考下这篇文章。

归属感 2017-06-05 10:43:55

http://wenku.baidu.com/view/310242e69b89680203d82599.html
这篇文章,讲的不错,值得读一读:)

刚开始讲的数据段、代码段、gdt啥的,不用管
简单的理解就是,当前程序访问的段,
并没有跟系统申请,或者是权限不够 非法访问
当然 这种理解不够专业 呵呵

文章中说的,常见是两种情况比较普遍
1.空指针
例如:*p = NULL 直接使用这种
2.内存越界
例如:数组下标、变量类型不一致

文章提供一个抓取这种错误的方法
好像是信号SIGSEGV挂handler, 我是linux初学者...

瑾兮 2017-05-16 04:50:24

一般是访问到了一个不存在的指针,堆栈溢出,或者数组越界之类的。

夜无邪 2017-02-01 16:04:18

gdb和valgrind都非常适合定位segfault。前者适合准确定位出现segfault的位置并且进行debug,后者适合检查在出现segfault之前有没有其他内存方面的未显露出来的问题。

想挽留 2017-01-06 09:47:07

无规律报错说明调用堆栈被修改了, 数组越界是最大的主因,看看你的memset数组或直接用index设置数组是否有越界检查。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文