[英]Is there a TRACE statement for basic win32 C++?
在MFC C ++(Visual Studio 6)中,我習慣使用TRACE宏進行調試。 是否有一個與win32相同的聲明?
_RPTn效果很好,雖然不太方便。 下面是一些代碼 ,它將MFC TRACE語句重新創建為允許可變數量參數的函數。 還添加了TraceEx宏,它預先添加源文件和行號,以便您可以單擊返回語句的位置。
更新:CodeGuru上的原始代碼不會在發布模式下為我編譯,因此我更改了為發布模式刪除TRACE語句的方式。 以下是我在Trace.h中的完整資源。 感謝Thomas Rizos的原作 :
// TRACE macro for win32
#ifndef __TRACE_H__850CE873
#define __TRACE_H__850CE873
#include <crtdbg.h>
#include <stdarg.h>
#include <stdio.h>
#include <string.h>
#ifdef _DEBUG
#define TRACEMAXSTRING 1024
char szBuffer[TRACEMAXSTRING];
inline void TRACE(const char* format,...)
{
va_list args;
va_start(args,format);
int nBuf;
nBuf = _vsnprintf(szBuffer,
TRACEMAXSTRING,
format,
args);
va_end(args);
_RPT0(_CRT_WARN,szBuffer);
}
#define TRACEF _snprintf(szBuffer,TRACEMAXSTRING,"%s(%d): ", \
&strrchr(__FILE__,'\\')[1],__LINE__); \
_RPT0(_CRT_WARN,szBuffer); \
TRACE
#else
// Remove for release mode
#define TRACE ((void)0)
#define TRACEF ((void)0)
#endif
#endif // __TRACE_H__850CE873
來自msdn docs, 用於報告的宏 :
您可以使用CRTDBG.H中定義的_RPTn和_RPTFn宏來替換使用printf語句進行調試。 當未定義_DEBUG時,這些宏會自動消失在發布版本中,因此不需要將它們包含在#ifdefs中。
還有OutputDebugString。 但是,在編譯版本時不會刪除它。
我只是使用這樣的東西(來自內存,根本沒有測試......)
#define TRACE(msg) {\
std::ostringstream ss; \
ss << msg << "\n"; \
OutputDebugString(msg.str()); \
}
然后我可以寫下這樣的東西: -
TRACE("MyClass::MyFunction returned " << value << " with data=" << some.data);
你可以將它包裝在一些#ifdefs中,以便在發布版本中輕松刪除它。
我發現使用_RPT()
宏也可以在Visual Studio 2005中使用C源文件。本文使用Visual Studio 2005/2008進行調試:日志記錄和跟蹤提供了TRACE,_RPT和其他日志記錄類型宏的概述。
我為一個名為ASSRTLOG的日志文件生成一行,其中包含日志,在將日志寫入文件時,我還執行以下源代碼行:
_RPT1(_CRT_WARN, "ASSRTLOG: %s", szLog1);
此行將進入日志文件的相同日志放入Visual Studio 2005 IDE的輸出窗口中。
您可能對我們用於記錄的方法背后的機制感興趣。 我們有一個函數PifLogAbort()
,它接受一系列參數,然后用於生成日志。 這些參數包括生成日志的文件的名稱以及行號。 宏看起來像這樣:
#define NHPOS_ASSERT_TEXT(x, txt) if (!(x)) { PifLogAbort( (UCHAR *) #x , (UCHAR *) __FILE__ , (UCHAR *) txt , __LINE__ );}
PifLogAbort()
的函數原型如下所示:
PifLogNoAbort(UCHAR *lpCondition, UCHAR *lpFilename, UCHAR *lpFunctionname, ULONG ulLineNo)
並使用宏我們將插入這樣的行:
NHPOS_ASSERT_TEXT(sBRetCode >= 0, "CliEtkTimeIn(): EtkTimeIn() returned error");
這個宏將做的是,如果返回代碼小於0(斷言失敗),將使用提供的文本生成日志。 日志包括生成日志以及文件名和行號的條件。
函數PifLogAbort()
生成具有指定長度的日志,並將輸出文件視為循環緩沖區。 日志還有時間和日期戳。
在我們想要在運行時動態生成描述性文本的情況下,也許是為了提供實際的錯誤代碼值,我們使用帶有緩沖區的sprintf()函數,如下面的代碼序列:
if (sErrorSave != STUB_BM_DOWN) {
char xBuff[128];
sprintf(xBuff, "CstSendBMasterFH: CstComReadStatus() - 0x%x, sError = %d", usCstComReadStatus, CliMsg.sError);
NHPOS_ASSERT_TEXT((sErrorSave == STUB_BM_DOWN), xBuff);
}
如果我們想要不生成日志,我們需要做的就是轉到定義宏的單個頭文件,並將其定義為無需重新編譯。 但是,我們發現這些日志在調查現場問題時非常有價值,在集成測試期間尤其有用。
跟蹤宏 ,提供帶有源代碼鏈接的消息, 運行時調用信息信息以及帶參數值的函數原型信息:
Windows事件是TRACE
宏的潛在替代品,具體取決於您的特定方案。 代碼被編譯為Debug和Release配置。 然后,可以動態啟用和禁用事件跟蹤,實時顯示或轉儲到客戶端的計算機上以供以后診斷。 跟蹤可以與從OS的其他部分收集的跟蹤信息相關聯。
如果您只需要在代碼到達某些檢查點時轉儲信息,以及可變內容,堆棧跟蹤或調用者名稱,Visual Studio的Tracepoints就是這樣做的非侵入式選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.