[C++]使用Global Flags偵測記憶體越界錯誤

[C++]使用Global Flags偵測記憶體越界錯誤

筆者在[C++]使用Pageheap偵測記憶體越界錯誤這篇介紹了如何利用Pageheap去偵測記憶體的越界錯誤,這樣的功能也可以使用Debuging Tools內的Global Flags工具,可以達到相同的效果,且較易取得與使用。

 

Debuging Tools有需要可在Microsoft Windows SDK for Windows 7 and .NET Framework 4這邊下載。

image

 

安裝時要注意Common Utilities下的Debuging Tools for Windows必須勾選。

image

 

安裝完後,若需要使用可直接點擊Global Flags開啟GUI。

image

 

GUI視窗帶出後切換至Image File頁籤,在Image輸入框中鍵入要偵測的程式名稱。

image

 

輸入完偵測的程式名稱后按下Tab鍵,下方被Disable的Checkbox會變為Enable狀態,這時可以針對需要去做些勾選設定,以筆者個人來說視習慣將heap有關的都勾選起來,設定好後按下套用即可。

image

 

當程式啟用偵測後,越界問題能更容易被發現,就像是筆者在[C++]使用Pageheap偵測記憶體越界錯誤這篇所提到的一樣,下面的Code運行在Debug模式下能得到跟Release模式一樣的運行結果,運行後因為越界錯誤所以直接Crush。

#include "stdafx.h"
#include <Windows.h>

int _tmain(int argc, _TCHAR* argv[])
{
    int m_len = 5;
    char *m_p = (char *)HeapAlloc (GetProcessHeap (), HEAP_ZERO_MEMORY, m_len);  
    m_p[m_len] = 0;  
    HeapFree (GetProcessHeap (),0, m_p);

	return 0;
}

 

image

 

Google Flags程式除了可以用GUI的方式去設定,也可以透過命令列的方式去使用,使用時必須注意命令提示字元要給予管理者的權限。

image

 

命令提示字元開啟後,我們可以帶入-p、/enable、與要偵測的程式名稱:

 

gflags -p /enable [ExeFile]

 

 

image

 

要關閉偵測時,則是帶入-p、/disable、與要關閉偵測的程式名稱:

gflags -p /disable [ExeFile]

image

 

若要查詢有哪些程式開啟了偵測狀態,可以只帶入-p參數:

gflags -p

image

 

Link