免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: sunceenjoy
打印 上一主题 下一主题

[C] 如何调试大程序中的Segmentation fault错误 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2008-10-17 13:48 |只看该作者
原帖由 Godbach 于 2008-10-17 13:17 发表
首先要大致的定位是哪里的问题啊。或者是各个模块分开调试。让出问题的地方更加细化。然后定位到某个模块了,就在这个模块里面用GDB,看看到那里出现了内存或指针操作失败的问题

这样的思路是不错的。我怎么在某个模块里用gdb呢。我现在出现的问题是把这个模块单独拿出来,虽然指针越界了,但运行到是没有问题,,这样的情况还能发现问题吗?。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
12 [报告]
发表于 2008-10-17 13:50 |只看该作者
原帖由 sunceenjoy 于 2008-10-17 13:48 发表

这样的思路是不错的。我怎么在某个模块里用gdb呢。我现在出现的问题是把这个模块单独拿出来,虽然指针越界了,但运行到是没有问题,,这样的情况还能发现问题吗?。


那就要搞清楚不同模块怎么的功能以及被调用的关系。然后让你的程序按照你的设定能够进入到该模块里面。然后可以单步调试什么的,都可以。还是需需要具体问题具体分析啊

论坛徽章:
0
13 [报告]
发表于 2008-10-17 13:53 |只看该作者
原帖由 nicozhou 于 2008-10-17 12:16 发表
没code,咋个猜啊

还有,编进PHP才会报错,在gdb下面没有报错,难道是和PHP有关?

这为大哥。跟php本身是没有关系的。跟自己写的代码有关系。

就想这样的程序

char x[4];
sprintf(x,"%c%c%c%c","1234");
/*
x为'1234\0',已经越界了。
我想单独运行它应该不会出错。虽然它已经越界了。我现在就是这样的情况.程序大的时候这个错误是致命的
*/



论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
14 [报告]
发表于 2008-10-17 13:57 |只看该作者
不知道LZ的程序是什么样结构的。我自己的笨方法,一般情况下找程序出问题的地方还是比较快的。
譬如在不同的调试点让程序打印你的行号,如果某个地方没有打印出来,而且你觉得你的程序肯定要走到这里,那你就看这行之前的代码,或者接着缩小调试范围。

论坛徽章:
0
15 [报告]
发表于 2008-10-17 14:01 |只看该作者
Godbach ,谢谢你经验分享,的确不错.

论坛徽章:
0
16 [报告]
发表于 2008-10-17 14:03 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
17 [报告]
发表于 2008-10-17 14:10 |只看该作者
我在windows下调试动态连接库文件的时候都是这样做的,将自己的日志全部输出到一个文件里面去。。。然后找错误,分析,调试。。。。。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
18 [报告]
发表于 2008-10-17 14:18 |只看该作者
原帖由 sunceenjoy 于 2008-10-17 14:01 发表
Godbach ,谢谢你经验分享,的确不错.


不用客气。这也是最基本的方法。我的程序很多是命令行程序,也有一些内核模块,基本上都是用这种方法。因为这样可以比较快的定位错误,当然,如果你用GDB设置断点的发那个是也可以,如果在断点之前出现段错误应该就会报错了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP