您的位置:控制工程论坛网论坛 » 教程与手册 » 软件编程经典培训实例 21、调试信息/打印信息的正确性

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

软件编程经典培训实例 21、调试信息/打印信息的正确性

xilinxue  发表于 2008/11/8 13:27:19      576 查看 0 回复  [上一主题]  [下一主题]

手机阅读

 案例 1

 为制作软件呼叫器,对SPT板的放音程序进行了修改,但是调试中发现进行呼叫后一段时间交换机自动重启。于是在修改的代码开始处增加了打印消息,跟踪程序流程。程序结构如下:
 


再次跟踪打印信息,发现消息打印消息1开始后就会发生重启现象,多次重试,发现消息1的结束跟踪打印有时有有时无,而消息2的打印一直没有跟踪到。初步判断程序错误发生在对消息1的处理于是集中力量检查对消息1的处理,但经过长时间的检查,并未在此处理流程中发现错误。于是在消息1的开始处直接RETURN,屏蔽掉消息1的处理。再次测试,发现重启现象依旧,偶尔能够看到函数入口处的打印消息。
为什么会出现这样的情况呢?什么情况导致重启呢?
从修改的情况看,可能的地方只有此两条消息处,会不会是第二条消息的处理造成的?虽然从现象看不太可能。报着试一试的想法在消息2的入口处也加了一RETURN,居然重启现象不重现了。
立即检查消息2的处理,很快发现在处理的开始由于指针使用错误导致程序死机重启。
错误是简单的,但是根据现象却使人得到错误判断。为什么消息2导致死机但其前的打印消息为什么后台看不见呢?
考虑一下交换机的消息打印机制,我们会发现,在程序中的打印消息并不是马上在后台上显示,消息从主机传到后台需要一定的时间。如果用Printf打印消息不久后,程序就发生严重错误而导致程序死机,而打印消息还没有来得及发送到后台,当然就不会出现我们想“应该有的”打印消息。
【总结】
1、由于环境的特殊性,我们常常认为“应该”的事件并没有发生,导致我们对问题迷惑不解;
2、“表面现象往往是骗人的”,要找到问题的实质可能需要绕过明显摆在我们面前的“表面现象”,从另一个角度考虑一下;


 

1楼 0 0 回复