寫給大學生新手的查殺bug方法

 原文發表於公衆號:濤歌依舊掃描二維碼,關注公衆號,免費領資料

圖片

 

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.

 

這篇文章很簡單,不值一提,希望對大學生朋友有益。週五了,祝聖誕快樂,週末快樂。早休息!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章