_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。 若使用者在偵錯訊息視窗中按一下 [中止] 按鈕,這些函示會立即中止且不會傳回值。
_RPT, _RPTF 偵錯巨集會呼叫 _CrtDbgReport 以產生偵錯報表。 這些巨集的寬字元版以及 _ASSERT[E]、_RPTWn 和 _RPTFWn,均會使用 _CrtDbgReportW 產生偵錯報表。 若有啟用 Just-In-Time (JIT) 偵錯,則當 _CrtDbgReport 或 _CrtDbgReportW 傳回 1 時,這些巨集就會啟動偵錯工具。
備註
_CrtDbgReport 和 _CrtDbgReportW 可以將偵錯報表傳送至三個不同的目的地:偵錯報表檔案、偵錯監視器 (Visual Studio 偵錯工具) 或偵錯訊息視窗。 兩個組態函式:_CrtSetReportMode 和 _CrtSetReportFile,可用於指定每個報表類型的一或多個目的地。 這些函式可供分別控制報告目的地和每個報表類型的目的地。 例如,可能指定只有 _CRT_WARN 的 reportType 要傳送至偵錯監視器,而 _CRT_ASSERT 的 reportType 則要傳送至偵錯訊息視窗和使用者定義的報表檔案。
_CrtDbgReportW 是寬字元版本的 _CrtDbgReport。 且其輸出和字串參數都會使用寬字元字串;除此之外都和單一位元組字元版本相同。
_CrtDbgReport 和 _CrtDbgReportW 會使用 printf 或 wprintf 函式所定義的相同規則,透過將 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。 若使用者按一下 [忽略],執行會繼續,且 _CrtDbgReport 和 _CrtDbgReportW 會傳回 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 函式。 如需使用偵錯巨集和報告函式的詳細資訊,請參閱 報告巨集。
若您的應用程式需要比 _CrtDbgReport 和 _CrtDbgReportW 所提供的更多彈性,您可以自行撰寫報告函式,並使用 _CrtSetReportHook 函式,將該報告函式附加至 C 執行階段程式庫報告機制。
需求
常式 |
必要的標頭 |
---|---|
_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。