向 debugger 致敬

一開始學程式設計時,從來就沒用過所謂的 debugger,當然最主要是沒有人教,以及參考的書籍鮮少提及這些工具。

由於在學校時的程式作業規模都不致於太大,所以 bug 的出現機會相對較少,而且大多很「明確」,當然我指的意思是想一下大概都會知道問題出在哪裡。但當寫的程式愈來愈大時,找 bug 卻是很重要的技巧。

過去我的程式遇到 bug 時,幾乎都是用所謂的「printf 法」來 debug。這個方法主要就是在自己覺得可能有問題的地方手動加入輸出變數值的函式(在 C 語言裡最基本的就用 printf),藉著觀察這些可疑變數的值來想想自己程式的邏輯哪裡出錯。這樣的作法十分直覺也很簡單,但是會遇到一些小麻煩,比方說 printf 是 bufferd-I/O,所以它輸出訊息的時間點很有可能不是程式出錯的地方,所以有時候仍然需要一些經驗值才能順利找出問題所在,而且更麻煩的是,每每要看不同的變數,就要爬程式碼再加上 printf,然後再 compiler -> run,手續太多 debug 就會愈來愈煩。

自從認識了 debugger 之後,我不敢說自己 debug 功力進步神速,但起碼花在 debug 的時間卻大幅下降!因為以往我需要反覆在不同的地方插入 printf 來監視變數的值,現在我只需要在 debugger 裡選擇要 watch 的變數,程式不需要重新 compile,當然你也可以自行設定中斷點讓程式在你希望停下來的地方停住,好讓你觀察程式邏輯。而讓我最感到方便的是,我本身碰過最多的 bug 就是 Segmentation fault,簡單地說就是存取到不正確的記憶體位址,用 printf 法通常需要一段時間才會發現到底是哪個 array 超出界限,或是指標指爛了之類的,但在 debugger 下,一旦 segmentation fault 了,它就會列出發生問題的那一行 code (當然你也可以利用 debugger 來看到 call stack),這樣對於解決問題的幫助實在是太大了!

既然 debug 是這麼地重要,我覺得學校在教程式設計時,也應該指導學生學習一些抓 bug 及 debug 的技巧,或是簡介一下常見 debugger 的概念及操作方法,相信對於很多人在初學程式設計時,能夠減少很多 de 不出 bug 的時間。

所以,我要認真地向 debugger 致敬!(挺)