程序运行时出错,如果是以下两种情况之一,我通常都能解决:
一,能够定位出错的大概位置。
二,错误能够被重现。
但,如果出错几率极低,不知道怎么重现,那我就没辙了。前段时间我的程序就遇到这么个问题:
RaiseException: Thread=85e6b8fc Proc=803dbc00 'SetupDemo.exe'
AKY=00000401 PC=03fad178(coredll.dll+0x00063178) RA=80009e54(NK.EXE+0x00008e54) BVA=00000000 FSR=00000000
从出错提示上看,是(coredll.dll+0x00063178)这个位置的问题,但coredll.dll根本没有代码,也不知道我的程序是从什么地方进入到这个出错的地方的,更糟糕的是——我没法重现这个错误,它出现概率很低,我完全不知道什么时候它会蹦出来。
今天运气比较好,我居然找到出错地方了,根本不是什么coredll.dll的代码有问题,说了你都觉得好笑,这是一个典型的除零错误,只不过出现概率很低。后来我另写了一个程序,故意执行了一个除零错误,结果也是出现类似的错误提示:
RaiseException: Thread=96d18a40 Proc=80096b80 'ZeroDivisor.exe'
AKY=00000401 PC=03fb09f8(coredll.dll+0x000629f8) RA=88037538(NK.EXE+0x00007538) BVA=00000000 FSR=00000000
我就纳闷着为什么调试器不会停在出错的地方,以便我发现这个错误呢?
经验经验,有时候我觉得我们开发者像艺术家,有时候我却觉得像侦探……