原文發表於公衆號:濤歌依舊(掃描二維碼,關注公衆號,免費領資料)
1947年9月9日,九九豔陽天,計算機歷史上的第一個bug誕生了,我們之前在古今計算機發展簡史(鏈接)中進行了比較詳細的介紹。對於程序員來說,寫bug、查bug、殺bug,都是司空見慣的事情。
我博客和公衆號的關注者中,有不少是大學生朋友。經常有人給我發一段程序,讓我幫找bug在哪裏。非工作日且有空的話,我一般會回覆:打log調試。僅舉三例來看看:
大學生1:
大學生2:
大學生3:
有時候,問題確實比較簡單,甚至一眼就可以看出來,但我也不會去直接指出來。授人以魚不如授人以漁,我更希望他能自己調試出來,並有所進步。比如:
所以,就有了這篇文章。下次再有大學生朋友讓你我幫找bug,就把這篇文章給他。順便說一下,雖然大學生嘴裏說大佬,但始終愧不敢當,我有自知之明,跟真正的大佬比,還差得遠。
程序調試,是一個極爲重要的能力。程序員,寫出bug,也基本是見怪不怪了。在不同的場景下,需要用不同的方法來查殺bug.
在實際工作中,經常要用十八般武藝,綜合使用或嘗試多種方法,纔能有效解決問題。客觀來說,我自己查殺bug的經驗和方法,應該還是比較豐富的。印象最深的是查出了一個linux系統的bug, 後來linux源碼更新併發布新版本後,這個bug得到了解決。
然而,對於多數剛學程序的大學生來說,只需要掌握一招簡單的方法,就可以搞定幾乎所有的問題。方法就是: 打log調試。
我以之前收到的一段代碼的簡化示例版爲例(原程序稍複雜一點):
#include <iostream>
using namespace std;
int main()
{
int a = 1;
int b = 2;
int c = 3;
int *p = 0;
*p = 0;
int d = a + b + c;
cout << d << endl;
return 0;
}
那位大學生的問題是:爲什麼沒有輸出d的值,想知道錯在哪裏?
其實,如果運行這段程序,會有信息提示錯在哪一行! 我現在假設他不知道怎麼看提示信息,那該如何查問題在哪裏呢?答案是:打log調試。如下:
#include <iostream>
using namespace std;
int main()
{
cout << "xxx1" << endl;
int a = 1;
cout << "xxx2" << endl;
int b = 2;
cout << "xxx3" << endl;
int c = 3;
cout << "xxx4" << endl;
int *p = 0;
cout << "xxx5" << endl;
*p = 0;
cout << "xxx6" << endl;
int d = a + b + c;
cout << "xxx7" << endl;
cout << d << endl;
cout << "xxx8" << endl;
return 0;
}
輸出結果是:
xxx1
xxx2
xxx3
xxx4
xxx5
這就奇怪了,有xxx5, 但沒有xxx6, 所以錯誤必然是*p=0這裏,這樣就找到問題所在了。
總之,對於新手而言,打log調試,查看每一步,是最簡單最可行的方法。如果這種方法還解決不了,我再看看是啥變異了的bug.
這篇文章很簡單,不值一提,希望對大學生朋友有益。週五了,祝聖誕快樂,週末快樂。早休息!