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