2012年2月21日 星期二

程式碼檢查

程式碼檢查

當程式碼撰寫完成之後,如何確認所寫的程式是否沒有問題呢。
如果有足夠的資本的話,購買使用klockwork或是parasoft等程式碼檢查工具當然是最好的選擇。但就一般寫程式的人而言,也許沒有機會使用上述兩種工具。
此篇便是介紹一些簡單好用,不用花錢的檢查方式。(For Windows)

  • 檢查各變數的初始值
  • 檢查是否存在內存越界 (gflags)
  • 檢查是否有記憶體洩漏 (VLD)


初始值
Visual C++而言,在Debug modeRelease mode,對於變數的初始值不同,Debug mode會將變數初始值設定為 0,但 Release mode直接配置對應的記憶體位置,此位置原本的值為多少,變數就會設定為對應的值。常見的情況就是程式碼可能會在debug mode可以正確執行,但是在release mode則出現錯誤,而且錯誤可能只會偶爾發生。所以將程式中所有位置先設定好初始值是一個簡單的防止錯誤方式。

內存越界 使用 gflags
這邊介紹的是windows提供的一個工具,可以直接從微軟的網站下載,連結下列網址 Debugging tools for windows ,若是電腦內已經安裝 WinDDK(Windows Driver Development Kit), 會內建此程式, 路徑如下: C:\WinDDK\7600.16385.1\Debuggers

用法如下:
1.  方法一,在command mode手動下指令,
例如:gflags –p /enable test1.exe /full
便會針對 test1.exe 設定內存越界檢查,一旦程式發生越界,系統便會發出警告通知使用者。
而獲得警告訊息的方式有二。
a.  visual c++環境中,執行test1.exe(debug mode),通常我會使用這種。
b.  執行test1.exe(release mode),執行 windbg,選擇 attatch to process並指定test1.exe

2.  方法二,使用GUI
這部分可以調整的參數非常的多,有需要用時再直接參考微軟的官方網站說明即可。http://msdn.microsoft.com/en-us/library/windows/hardware/ff549596(v=vs.85).aspx

記憶體洩漏
當使用visual c++執行程式時,若出現memory leak,則在程式執行結束後,會告知已經有 memory leak 產生,若是一個簡單的程式,可能可以直接由visual c++的調試視窗中找到對應產生 memory leak的程式碼。

但若是一個複雜的程序,還是得依賴工具的使用,才能方便快速的解決memory leak 的問題,此處將會介紹的是 vld debug view的結合使用。

VLD (Visual Leakage Detect) open source,是一個針對Visual C++設計,用來檢查 memory leak的工具。
使用方式很簡單
1.  安裝 VLD,此時安裝程式會詢問放置vld_x86.dllvld_x64.dll的路徑,記得要設定在visual c++能夠參考到的地方。不然就需要手動設定路徑。
2.  在所撰寫的程式中加上 #include “vld.h”
3.  接著編譯,執行你所撰寫的程式,此時程式便會自動使用VLD所提供的功能,當程式執行結束之後,所有沒被釋放的記憶體,會統一顯示在visual cdebug視窗中。
4.  因為訊息很多,因此可以使用微軟提供的debug view工具來擷取訊息,以利觀看。個人習慣是用debug view攔截訊息後,存檔後,再使用ultraedit觀看。
5.  此工具的好處是會顯示完整的call stack,因此可以很容易的定位到問題產生的位置。
其偵測結果舉例如下:

註:Visual C++內建CRT方式檢查memory leak,但是此方式所顯示的訊息並不如 VLD完整。

參考資料: