發表文章

目前顯示的是 11月, 2011的文章

How to debugger? (1)

圖片
許多人都說:不懂debugger的人,不會寫程式。身為一個會寫程式的程序員,我也是十分同意這句話的。想當初我也是渾渾噩噩的寫了一陣子程式之後,才知道什麼是debugger,之後果然就好像打通任督二脈一樣,突飛猛進。所以說,要會寫程式,一定要會debugger。礙於有許多新手程序員還是不懂什麼叫作debugger,所以就寫了這篇文,對debugger作一個基本的介紹,希望能對大家有所幫忙,可以像我一樣勇猛精進。 首先,由寫一個小小的測試程式開始,慢慢的再進入主題。 #include <iostream> using namespace std; int mul2(int a) {   return 3 * a; } int main(void) {   if (20 == mul2(10))     cout << "debugger讚!\n";   else     cout << "奇怪ㄋㄟ\n";   return 0; } 下面是程式執行的結果。 真是奇怪ㄋㄟ,應該是要顯示"debugger讚!"才對吧!?這個時候只好來debugger一下下了,看看問題出在那裡。 第一招,小紅點 下小紅點,也就是所謂的下斷點,也有人說中斷,或說breakpoint。在程式裡面放個小紅點,當程式跑到有小紅點的地方的時候就會停下來,這時候我們就抓到機會,可以去檢查看看各個可疑的地方,也可以偷偷竄改一些資料,無所不用其極的就是要把程式裡面的虫抓出來搞定它。 下小紅點的方法有很多種,這裡我可以告訴你四種方法。 __debugbreak(); __asm int 3 __asm _emit 0xCC 以上的方法都是手動在程式裡面放入小紅點,也就是在程式裡面塞進一個0xCC。那到底0xCC是什麼東西。去查一下x86指令集,原來0xCC就是int3。你又要問:什麼是int3?答案是:int3是個中斷,由x86硬體支援,軟體觸發。 當CPU執行指令的時候,如果執行到的指令是0xCC,也就是int3的時候,它會發出一個中斷,也就是interrupt。中斷發生的時候,CPU會暫時停止目前手上的工作,然後跳到事先準備好的中斷處理常式去執行,就跟執行副程式