标签:
凭空想象,问题的原因很多,实际的原因只有看了才能发现! 如果猜测失败是如何发生的,那么常常会修复一些不是bug的问题,不仅浪费时间、还会破坏其它地方,因此不要这样做。 在医学领域,有听诊器、抽血化验、X透视、B超等方法。同样 在软件中,观察的方法有设置断点、添加调试语句、监视程序值、以及检查内存等方法。硬件方法有通过示波器、逻辑分析仪、示波器等工具测试信号、时序和线路阻抗等方式。当错误的假设别否定后,找到bug的工作量和之前相比一样多,但是给你时间变少了,因此必须依靠下面的原则进行。
1、观察失败
发现bug时,看到是其实是失败的结果,你必须仔细观察,找到足够多的细节,才能调试它。如果不留意发生的全过程,可能导致你曲解很多问题,修复错误的地方,更糟的是可能由于时序改变,真正问题被隐藏起来,导致误以为bug已修复。
2、查看细节
典型情况是,每次为了发现故障而观察系统,都会了解更多与失败有关的信息,这将有助于你确定下一步观察哪些地方以获取跟多细节,这样才能根据细节查看设计并找到问题原因。对细节的观察要一直持续,直至可以锁定的问题的原因在几种可能性之内。这个过程中,经验会起到帮助作用,经验会告诉你什么时候问题原因已被锁定,并做一个好的调试人员。 比如偶尔出现的bug,如果看到底层失败细节后,当认为bug已修复后,就很容易证实确已修复,而不必依靠统计数据,就可以看到问题不在发生。
3、植入插桩工具
开发过程中,可以采用软件单步跟踪、插入断点的方式进行调试;发行后,就只能在监视器中输入有意义的变量,以便运行时观察,在任何状态,都应该开启一个调试窗口,并且让代码输出状态信息,在PC、服务器中,往往利用运行日志。在嵌入式系统中,通常使用串口和PC机通讯,利用上位机监控运作状态。 最好的方法是,从开始设计就考虑调试的问题,把插桩作为产品需求一部分。这有助于后期的调试、在思考哪里需要插桩时,还有助于更好的设计系统并避免bug。 无论设计时考虑的如何周到,开始调试后总会有些无法预料的情况。因此,不必担心,只需在必要时对系统进行插桩即可,需要注意的是,植入插桩工具后,要使失败再次发生,而且确保对问题没有影响,找到问题并解决后,要清除插桩,以便不影响最终产品。
4、添加外部插桩工具
当调试硬件时,可以使用万用表、示波器、逻辑分析仪、频谱仪等其它仪器观察硬件。需要注意的时,所有仪器必须要有足够的速度和精确度,以便能够测量到错误,比如如果使用带宽200M的示波器,就无法观察230M的信号饱和变形的问题。
5、不要害怕深入研究
如果代码有bug,为了修复它,需要重新构建软件,首先构建一个调试版本,添加调试语句以查看需要查看的的参数,修复后,使用#ifdef 标记所有调试语句并重新交付产品代码。
6、注意海森堡效应
海森堡效应,在量子领域为测不准原理,因此任何插桩都可能影响原有的系统,比如示波器的探针增加了电路的电容,不同的软件版本,可能软件运行时间和规模会有不同,打开机箱盖子,会改变内部零部件的温度等。因此必须在插桩后,使系统再次失败,以确保未被海森堡效应所困。
7、猜测只是为了确定搜索的重点
在理解了系统的基础上,你的猜测可能很接近事实,这是好事,这样可以确定搜索到重点,但是在尝试修复前,仍需再次看到失败,以便确认猜测是正确的。但是不要过分相信猜测,它往往会把你带偏方向,引入歧途。 例外的情况是,如果某些问题比其它问题容易出现,或者容易修复,则首先检查这些问题。比如灯泡不亮了,应该首先更换灯泡,如果好了,说明问题解决了,否则再检查开关、再检查线路是否老化。
标签:
原文地址:http://www.cnblogs.com/shuolang/p/5300474.html