程序運行時出錯,如果是以下兩種情況之一,我通常都能解決:
一,能夠定位出錯的大概位置。
二,錯誤能夠被重現(xiàn)。
但,如果出錯幾率極低,不知道怎么重現(xiàn),那我就沒轍了。前段時間我的程序就遇到這么個問題:
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根本沒有代碼,也不知道我的程序是從什么地方進入到這個出錯的地方的,更糟糕的是——我沒法重現(xiàn)這個錯誤,它出現(xiàn)概率很低,我完全不知道什么時候它會蹦出來。
今天運氣比較好,我居然找到出錯地方了,根本不是什么coredll.dll的代碼有問題,說了你都覺得好笑,這是一個典型的除零錯誤,只不過出現(xiàn)概率很低。后來我另寫了一個程序,故意執(zhí)行了一個除零錯誤,結(jié)果也是出現(xiàn)類似的錯誤提示:
RaiseException: Thread=96d18a40 Proc=80096b80 'ZeroDivisor.exe'
AKY=00000401 PC=03fb09f8(coredll.dll+0x000629f8) RA=88037538(NK.EXE+0x00007538) BVA=00000000 FSR=00000000
我就納悶著為什么調(diào)試器不會停在出錯的地方,以便我發(fā)現(xiàn)這個錯誤呢?
經(jīng)驗經(jīng)驗,有時候我覺得我們開發(fā)者像藝術(shù)家,有時候我卻覺得像偵探……