程式碼檢查
當程式碼撰寫完成之後,如何確認所寫的程式是否沒有問題呢。
如果有足夠的資本的話,購買使用klockwork或是parasoft等程式碼檢查工具當然是最好的選擇。但就一般寫程式的人而言,也許沒有機會使用上述兩種工具。
此篇便是介紹一些簡單好用,不用花錢的檢查方式。(For Windows)
- 檢查各變數的初始值
- 檢查是否存在內存越界 (gflags)
- 檢查是否有記憶體洩漏 (VLD)
初始值
以Visual C++而言,在Debug mode與Release 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.dll與vld_x64.dll的路徑,記得要設定在visual c++能夠參考到的地方。不然就需要手動設定路徑。
2. 在所撰寫的程式中加上 #include “vld.h”
3. 接著編譯,執行你所撰寫的程式,此時程式便會自動使用VLD所提供的功能,當程式執行結束之後,所有沒被釋放的記憶體,會統一顯示在visual c的debug視窗中。
4. 因為訊息很多,因此可以使用微軟提供的debug view工具來擷取訊息,以利觀看。個人習慣是用debug view攔截訊息後,存檔後,再使用ultraedit觀看。
5. 此工具的好處是會顯示完整的call stack,因此可以很容易的定位到問題產生的位置。
其偵測結果舉例如下:
註:Visual C++內建CRT方式檢查memory
leak,但是此方式所顯示的訊息並不如 VLD完整。
參考資料:
1.
微軟gflags
資源
3.
VLD http://vld.codeplex.com/
4. Linux Memory Leak Detection
5. MAC Memory Leak Detection
6. 在 Linux 平台中調適 C/C++ 內存泄漏方法
4. Linux Memory Leak Detection
5. MAC Memory Leak Detection
6. 在 Linux 平台中調適 C/C++ 內存泄漏方法