crt_dbg2 範例:C 執行階段偵錯攔截函式

更新:2007 年 11 月

crt_dbg2 範例說明了將偵錯攔截函式和 C 執行階段程式庫偵錯版本搭配使用的多種方式。為了提升真實性,其中有使用一些實際應用程式的項目,包含兩個錯誤。

注意事項:

Intel Itanium 處理器不支援本範例。

安全性注意事項:

這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。

若要取得範例和指示以便進行安裝:

  • 按一下 Visual Studio [說明] 功能表上的 [範例]。

    如需詳細資訊,請參閱尋找範例檔案

  • 最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。

  • 您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於 Visual Studio 的 Express 版,所有範例都可在線上找到。

建置和執行範例

若要建置和執行這個範例

  1. 開啟 crt_dbg2.sln 方案。

  2. 在 [建置] 功能表中,按一下 [建置]。

  3. 在 [偵錯] 功能表中,選取 [啟動但不偵錯]。

範例如何操作

程式會將生日資訊儲存在用戶端區塊的已連結清單中。Client-Dump 攔截函式會驗證生日,並回報用戶端區塊的內容。配置攔截函式會將堆積 (Heap) 作業記錄到文字檔內,而報告攔截函式則會將選取的報告記錄到相同的文字檔內。

請注意,配置攔截函式會明確地將 CRT 區塊 (C 執行階段程式庫以內部方式配置的記憶體) 排除於記錄之外。該攔截函式會使用 fprintf 來寫入記錄檔,而 fprintf 則會配置一個 CRT 區塊。在這種狀況下,如果 CRT 區塊並未被排除,則永無止境的迴圈將會讓堆疊溢位:fprintf 會導致攔截函式被呼叫,而該攔截函式會接著再呼叫 fprintf,然後 fprintf 又會導致攔截函式被呼叫,如此一直重複。

為了能夠回報配置攔截中 CRT 類型的區塊,您可以使用 Windows API 函式來取代 C 執行階段函式。因為 Windows API 並不是使用 CRT 堆積,所以不會讓攔截陷入永無止盡的迴圈。

偵錯堆積會在第二個範例中找到兩個錯誤和一個資料錯誤。一個錯誤是生日名稱的欄位不夠大,無法容納多個測試名稱。這個欄位必須再大一點,而且應該使用 strncpy,而非使用 strcpy。第二個錯誤則是 printRecords 函式中的 while 迴圈應該等到 HeadPtr 本身等於 null 時才結束。這個錯誤不但會導致生日無法完整顯示,還會造成記憶體遺漏 (Memory Leak)。最後,Gauss 的生日應該是 April 30,而不是 April 32。

關鍵字

本範例使用下列關鍵字:

_assert、_asserte、_crtcheckmemory、_crtmemcheckpoint、_crtmemdumpallobjectssince、_crtmemdumpstatistics、_crtsetallochook、_crtsetdbgflag、_crtsetdumpclient、_crtsetreportfile、_crtsetreporthook、_crtsetreportmode、_free_dbg、_malloc_dbg、_rpt4、_strdate、_strtime、aboutbox、clear_crt_debug_field、createinstance、createrecord、displaystring、donttouch、exit、fatalerror、fclose、fflush、fopen、fprintf、fputs、get_size、helpstring、id、iid_is、module、myallochook、mydumpclienthook、myreporthook、pointer_default、printf、printrecords、put_size、set_crt_debug_field、strcpy_s、strstr、uuid

請參閱

其他資源

一般範例