程序调试(除错)过程中的一些雕虫小技(七、向猎人学习挖坑设陷阱的技术)
上一回说到,在程序中设卡(断点),可以拦截流窜犯(程序流程错误)。实际上,断点的功能可强大了,不但可以拦截程序流程错误,也可以拦截数据错误。当然,这需要一些辅助手段。
还是以前面提到的一个例子来说。比如某个采样值(当然,也不一定是采样值,在这里也可以是RAM中任意单元中的值)受到未明因素影响,经常“乱跳”。这种数据出错的原因,可能如下:
1、计算错误(比如溢出),导致结果出错;
2、被其它程序段误改写;
3、其它原因……
当数据出错后,我们希望能够在最快时间内,让程序停下来,这样才能有效查出是哪一段程序出了问题。
有些调试环境本身可以捕捉数据错误,并产生断点中断。这当然最好不过。但是如果调试环境本身不提供这种捕捉功能,那么就需要我们自己来制造机关了。
看看猎人是是如何做的:他们会在猎物经过的地方,挖个坑,上面盖上浮土。当小型动物经过时,浮土不会塌陷。而当体重较大的动物经过时,它们的体重就会压垮浮土,掉进猎人的陷阱。
猎人的这个陷阱机关,妙就妙在是它“智能”的,会根据动物的体重进行筛选。
轻巧的小白兔来了——放过,笨重的大狗熊来了——捕获!欧耶!
好了,回到程序中来,假设我们要监控的那个RAM单元,正常值域为0~9;那么我们可以写一段测试代码,判断数值是否>9,根据判断结果执行两个分支,并在那条错误的分支路径上设置断点。
如果数据没有出错,程序会一直运行(小白兔请放心过去);直到数据错误发生,断点会自动停下来(大狗熊给我拿下)。
我们可以把这段测试程序,插入在“狗熊出没”的地方,“守株待兔”(其实“守坑待熊”)。
接下来的事情,就跟上回说的抓流窜犯原理差不多了。
——什么,你喜欢吃兔肉?不喜欢吃熊掌?
——你也太没有爱心了,唉。。。。。
程序匠人 2009-8-24 13:17
sxcem_562775947 2009-8-23 20:13
sxcem_562775947 2009-8-23 20:09