如何使用 _crtBreakAlloc 來調試記憶體分配


摘要


當您使用 debug C 執行時間(CRT)來追蹤記憶體洩漏時,請在立即設定中斷點,然後再將產生洩漏的記憶體進行配置。 透過在編譯時間或執行時間設定 _crtBreakAlloc,您可以在特定的記憶體配置點處產生使用者定義的中斷點。

其他相關資訊


使用調試-CRT 函數(例如 _CrtDumpMemoryLeaks)追蹤記憶體洩漏時,通常會出現括在大括弧({})中的分配編號。 例如,以下是分配編號18的記憶體洩漏:
   Detected memory leaks!   Dumping objects ->   {18} normal block at 0x00660BE4, 10 bytes long   Data: <          > CD CD CD CD CD CD CD CD CD CD   Object dump complete. 
在指派這個記憶體之前,請先設定一個中斷點,如此一來,您就可以逐步執行堆疊程式,並查看哪些函數導致記憶體已被指派。 調試-CRT 函數 _CrtSetBreakAlloc,可讓您指定要中斷的分配編號。 這個方法需要您在每次想要設定分配中斷點時重新編譯程式。 替代方法是使用 [監看視窗] 並動態設定分配中斷點。 這個方法的優點是不需要變更或重新編譯任何來來源程式代碼。如果您是靜態連結到 C 執行時間,您想要變更的變數稱為 [_crtBreakAlloc]。 如果您是動態連結到 C 執行時間,您想要在 [監看視窗] 視窗中變更的變數是 {、msvcr40d} * __p__crtBreakAlloc ()(如果您使用的是 Visual c + + 4.0 或4.1)。 如果您使用的是 Visual c + + 4.2 或更新版本,[監看視窗] 中您要變更的變數應該是 {,,msvcrtd} * __p__crtBreakAlloc ()。若要判斷您要編譯的 CRT 版本為何:
  1. 從 [建立] 功能表中,選擇 [設定]。
  2. 在 [設定:] 窗格中,選取您要建立的配置。 選擇 [C/c + +] 索引標籤,然後選取 [程式碼產生] 類別。
此時應該會出現 [使用執行時間文件庫] 對話方塊,其中顯示您所使用的 CRT 版本。 (如果此設定為空白,請確定您已在 [設定:] 窗格中選取了一項配置)。若要動態設定分配中斷點,請執行下列步驟:
  1. 啟動您的調試會話。 從 [建立] 功能表中,選擇 [調試-> 單一步驟]。 如果您使用的是「調試單一線程」或「調試多重執行緒 CRT」,請依照步驟1a 進行。 否則,請依照步驟1b 進行。
    1. 在 [監視] 視窗中輸入 _crtBreakAlloc。 這會顯示您程式將停止的目前分配編號。 程式第一次啟動時,此分配編號應該是-1。
    2. 如果您使用的是 Visual c + + 4.0 或4.1,請在 [監視] 視窗中輸入 {、、msvcr40d} * __p__crtBreakAlloc ()。 如果您使用的是 Visual c + + 4.2 或更新版本,請輸入 {,,msvcrtd} * __p__crtBreakAlloc ()。 這會顯示您程式將停止的目前分配編號。 程式第一次啟動時,此分配編號應該是-1。
  2. 按兩下-1 值,然後輸入導致使用者定義的中斷點的新分配編號。
  3. 從 [調試] 功能表中,選擇 [調試-> 移至]。
如需 _crtBreakAlloc 的詳細資訊,請參閱線上說明中的「追蹤堆分配要求」。