『程序員調(diào)代碼訪談』是Karim Hamidou 發(fā)起的一個程序員訪談系列,受訪者分享他們遇到的最難/最有意思的Bug,以及如何解決。
本文的受訪者是Marc-AndréCournoyer。 你是誰?
我是一名軟件開發(fā)者兼企業(yè)家。我來自加拿大的魁北克。我創(chuàng)建了OSS(譯注:一個Ruby Web 服務(wù)器),寫了一本書,出售了一些業(yè)務(wù)?,F(xiàn)在我主要編寫代碼,在Coded教學(xué)。
你遇到最困難/有趣的bug是什么,你是如何解決?
最近,我為我的代碼俱樂部編寫了一個虛擬機,但不明白它為什么不能工作。
虛擬機的工作原理和CPU一樣。它有一個指針指向當(dāng)前正在執(zhí)行指令。通常該指針被稱為程序計數(shù)器(pc)。
虛擬機工作原理是執(zhí)行一條指令并跳轉(zhuǎn)到下一條。我就是那樣編寫的。指令的執(zhí)行在一個很大的switch-case循環(huán)中完成。然后,增加程序計數(shù)器的值跳轉(zhuǎn)到下一條指令(指令長度為2個字節(jié),所以pc+=2)。
當(dāng)然,有些指令也可以調(diào)整程序計數(shù)器值。特別是用于控制流的實現(xiàn)(比如if)。這些指令能夠?qū)⒊绦蛴嫈?shù)器的值設(shè)置成內(nèi)存中的某個地址。如果條件為真,程序指針將會指向內(nèi)存中對應(yīng)代碼塊的地址。這是CPU實現(xiàn)所有控制流結(jié)構(gòu)的方式。
這里有個bug。記得之前說過,執(zhí)行完一條指令,我就增加程序計數(shù)器的值。那意味著每當(dāng)執(zhí)行一條if語句,虛擬機都將跳轉(zhuǎn)到對應(yīng)內(nèi)存地址+2的位置。多移動了兩個字節(jié)。
解決方案是在執(zhí)行指令之前增加程序計數(shù)器的值。 有什么要補充的?
以下是我用偽機器代碼解決bug的過程。
1.遇到bug受阻。 2.用頭撞擊鍵盤。 3.停止編碼,離開電腦。 4.回到電腦前,嘗試些新的改動。 5.如果bug解決,跳轉(zhuǎn)到第7步。 6.跳轉(zhuǎn)到第2步。 7.喝酒慶祝。
每當(dāng)發(fā)現(xiàn)bug,我努力地想要忽略它,保持自信,但都是徒勞。 原文來源:Debuggers
|
|