C代码中的异常问题
在一个比较大的C代码项目中,出现过这样的问题。
平时运行都是正常的。
在某个函数中间增加一个 打印语句 printf(),打印一些字符串,然后再执行时就会出现异常。
删除打印语句,或者在其他的地方增加一些毫无意义的东西,比如增加一个空函数,或者增加一些打印。
异常消失。
各位,在实际工作中有没有遇到过这样的情况,可能是什么导致造成的呢。实在太异常了。
我的分比较多,能比较好的解决,无所谓的。
问题点数:100、回复次数:12Top
1 楼shockwave_115(采姑娘的小蘑菇)回复于 2005-06-01 17:45:34 得分 5
估计是指针越界或者没有初始化,printf访问的内存有问题Top
2 楼mccxj(老鼠不逛街)回复于 2005-06-01 17:46:46 得分 10
在一个比较大的C代码项目中,出现过这样的问题。
平时运行都是正常的。
在某个函数中间增加一个 打印语句 printf(),打印一些字符串,然后再执行时就会出现异常。
删除打印语句,或者在其他的地方增加一些毫无意义的东西,比如增加一个空函数,或者增加一些打印。
异常消失。
各位,在实际工作中有没有遇到过这样的情况,可能是什么导致造成的呢。实在太异常了。
我的分比较多,能比较好的解决,无所谓的。
~~~~~~~~~~~估计是编译器的问题。。以前我也遇到很奇怪的问题。。增加一个<<endl;就没事情。。。如果去了。后边的东西就执行不了了。。。到现在我也不明白是怎么回事。。。Top
3 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-06-01 17:48:57 得分 0
呵呵,markTop
4 楼foochow(无聊,灌水......)回复于 2005-06-01 17:53:53 得分 0
没遇到过,关注mark!!Top
5 楼Michael_555(Nothing)回复于 2005-06-01 18:05:35 得分 5
栈溢出了。
查查你的数组是否越界或者指针没有分配内存便使用。
Top
6 楼whyglinux(山青水秀)回复于 2005-06-01 18:09:32 得分 10
这说明在程序中存在着未定义的行为。通常由于指针的非法内存访问而导致的程序的未定义行为最为常见。
首先要了解程序异常时的出错信息。其次要找出程序异常发生的地点,这样对程序进行调试跟踪就是必须的了。找到异常发生的地方之后,就可以对附近的源代码进行重点检查了。Top
7 楼kikikind(可乐)回复于 2005-06-01 18:36:43 得分 0
在汇编里试过~~~~~一开始运行我写的程序没输出,要先运行一个可以执行的程序,再运行我写的程序才出现结果!!-_-!Top
8 楼ngucc(嘎嘎)回复于 2005-06-01 18:56:36 得分 5
听我老师说过,PRINTF有好多问题,本身的漏洞,我不懂Top
9 楼herryhuang(Herry)回复于 2005-06-01 21:26:07 得分 50
首先,我们应该相信编译器,这个应该不是编译器的问题。
然后,需要确认不是因为多线程或多进程的程序发生数据访问冲突,因为printf的执行周期较长,其间可能会有任务切换。
将你的printf(就是会导致异常的地方)尽量简化,最好其中的参数不要包含有宏、其他函数调用。
在调用printf之前,首先调用fflush,并检查标准输入、标准输出和标准出错文件的状态(看文件是否正常打开,并且文件结构各个参数无错)
printf本身确实应该谨慎使用,但是如果按照你说的,随便打点什么(比方说只打一个回车符,或者什么也不打,只调用一下printf(""))就出错的话,应该是程序中有指针跑飞了,如果想验证这一点,建议长时间、大负荷量的进行耐压测试,我相信程序会跑死的。
有一些调试工具可以用来检查内存泄露(但是没发现检查数组越界的工具,如果谁见过,劳驾告诉我,这个属于C语言的“根本”问题决定的),你可以试试,如果确定是内存泄露的问题,而且很不好查,那就需要将程序分解,进行单元测试,一个模块一个模块的排除问题。
通常充分的单元测试可以找到指针跑飞的问题,我碰到过的最难查的内存泄露问题是采用重写malloc和free来完成的(那个模块代码23万行),将程序中所有的malloc和free都替换成自己定义的宏,在宏中以特定格式写日志文件,其中记录分配内存的地址、大小以及释放内存的地址,还有调用处的文件名,行号和函数名,不断运行程序直到崩溃。然后另写一个程序处理这个日志文件,将其中的记录利用数据库处理,终于查出问题之所在。
因为检查内存泄露是最费尽的,所以,建议建议进行充分的单元测试和集成测试。
上面是一点点经验,你先试试看。Top
10 楼MagicCarmack(MagiC++)回复于 2005-06-01 21:32:07 得分 5
学习楼上的。。。。。。。。。。Top
11 楼mostideal(三甲)回复于 2005-06-02 00:21:24 得分 5
帮顶。。Top
12 楼nasi00(莫傲·逍遥)回复于 2005-06-02 01:56:56 得分 5
应该是是程序中有些动作的结果是“不被预知”的,这样就会出现一些莫名其妙的问题了……Top




