_CrtDbgReport
, _CrtDbgReportW
產生具有偵錯訊息的報表,並將報表傳送至三個可能的目的地 (僅限偵錯版本)。
語法
int _CrtDbgReport(
int reportType,
const char *filename,
int linenumber,
const char *moduleName,
const char *format [,
argument] ...
);
int _CrtDbgReportW(
int reportType,
const wchar_t *filename,
int linenumber,
const wchar_t *moduleName,
const wchar_t *format [,
argument] ...
);
參數
reportType
報表類型:_CRT_WARN
、_CRT_ERROR
和 _CRT_ASSERT
。
filename
發生判斷提示/報表之原始程式檔的名稱的指標,或為 NULL
。
lineNumber
發生判斷提示/報表之原始程式檔中的行號,或為 NULL
。
moduleName
發生判斷提示或報表之模組 (.exe 或 .dll) 的名稱的指標。
format
用於建立使用者訊息之格式控制字串的指標。
argument
format
使用的選擇性替換引數。
傳回值
針對所有報告目的地,如果發生錯誤, _CrtDbgReport
則 _CrtDbgReportW
傳回 -1;如果沒有發生錯誤,則傳回 0。 不過,當報表目的地是偵錯訊息視窗,而用戶選擇 [ 重試 ] 按鈕時,這些函式會傳回 1。 如果使用者在 [偵錯訊息] 視窗中選擇 [中止 ] 按鈕,這些函式會立即中止,且不會傳回值。
_RPTF
偵_RPT
錯巨集會呼叫 _CrtDbgReport
以產生其偵錯報告。 這些巨集的寬字元版本,以及_ASSERT
、 _ASSERTE
_RPTW
和 _RPTFW
,會使用 _CrtDbgReportW
來產生其偵錯報告。 當或_CrtDbgReportW
傳回 1 時_CrtDbgReport
,如果啟用 Just-In-Time (JIT) 偵錯,這些巨集會啟動調試程式。
備註
_CrtDbgReport
和 _CrtDbgReportW
可以將偵錯報告傳送至三個不同的目的地:偵錯報表檔案、偵錯監視器(Visual Studio 調試程式),或偵錯訊息視窗。 和兩個組態函式 _CrtSetReportMode
_CrtSetReportFile
可用來指定每個報表類型的目的地或目的地。 這些函式可供分別控制報告目的地和每個報表類型的目的地。 例如,您可以指定 reportType
的 _CRT_WARN
只能移至偵錯監視器,而 reportType
_CRT_ASSERT
的 會同時移至偵錯消息視窗和使用者定義的報表檔案。
_CrtDbgReportW
是寬字元版本的 _CrtDbgReport
。 其所有輸出和字串參數都是寬字元字串;否則,它與單一位元組字元版本相同。
_CrtDbgReport
並使用 _CrtDbgReportW
或 wprintf
函式所printf
定義的相同規則,將自變數取代argument[n]
為format
字串,以建立偵錯報表的使用者訊息。 然後這些函式會根據目前的報表模組以及針對 reportType
所定義的檔案,產生偵錯報表並決定一或多個目的地。 當報表是傳送至偵錯訊息視窗時,會在顯示於視窗中的資訊裡包含 filename
、lineNumber
和 moduleName
。
下表列出針對報表的一或多個模式和檔案,以及 _CrtDbgReport
和 _CrtDbgReportW
的結果行為所提供的選擇。 這些選項會在crtdbg.h>中<定義為位旗標。
報表模式 | 報表檔案 | _CrtDbgReport 、_CrtDbgReportW 行為 |
---|---|---|
_CRTDBG_MODE_DEBUG |
不適用 | 使用 Windows OutputDebugString API 寫入訊息。 |
_CRTDBG_MODE_WNDW |
不適用 | 呼叫 Windows MessageBox API 來建立消息框,以顯示訊息以及 中止、 重試和 忽略 按鈕。 如果用戶選擇 [中止], _CrtDbgReport 或 _CrtDbgReport 立即中止。 如果用戶選擇 [ 重試],則會傳回 1。 如果使用者選擇 [忽略],則執行會繼續並_CrtDbgReportW _CrtDbgReport 傳回 0。 當錯誤狀況存在時,選擇 [忽略] 通常會導致未定義的行為。 |
_CRTDBG_MODE_FILE |
__HFILE |
使用 Windows WriteFile API 將訊息寫入使用者提供的 HANDLE ,且不會驗證檔句柄的有效性;應用程式負責開啟報表檔案並傳遞有效的檔句柄。 |
_CRTDBG_MODE_FILE |
_CRTDBG_FILE_STDERR |
將訊息寫入至 stderr 。 |
_CRTDBG_MODE_FILE |
_CRTDBG_FILE_STDOUT |
將訊息寫入至 stdout 。 |
可將報表傳送至一到三個目的地,或是傳送到沒有任何目的地。 如需指定報表模式或模式和報表檔案的詳細資訊,請參閱 _CrtSetReportMode
和 _CrtSetReportFile
函式。 如需使用偵錯巨集和報告函式的詳細資訊,請參閱 報告巨集。
如果您的應用程式比 和 _CrtDbgReportW
所提供的_CrtDbgReport
彈性還要多,您可以使用 函式撰寫自己的報告函式,並將其連結至 C 運行時間連結庫報告機制_CrtSetReportHook
。
需求
常式 | 必要的標頭 |
---|---|
_CrtDbgReport |
<crtdbg.h> |
_CrtDbgReportW |
<crtdbg.h> |
_CrtDbgReport
和 _CrtDbgReportW
是 Microsoft 擴充功能。 如需詳細資訊,請參閱相容性。
程式庫
僅限偵錯版本的 C 執行階段程式庫。
範例
// crt_crtdbgreport.c
#include <crtdbg.h>
int main(int argc, char *argv[]) {
#ifdef _DEBUG
_CrtDbgReport(_CRT_ASSERT, __FILE__, __LINE__, argv[0], NULL);
#endif
}
如需如何變更報表函式的範例,請參閱 crt_dbg2
。
另請參閱
偵錯常式
_CrtSetReportMode
_CrtSetReportFile
printf
、 、 _printf_l
、 wprintf
_wprintf_l
_DEBUG