簡體   English   中英

是否有基本win32 C ++的TRACE語句?

[英]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);
}

如果我們想要不生成日志,我們需要做的就是轉到定義宏的單個頭文件,並將其定義為無需重新編譯。 但是,我們發現這些日志在調查現場問題時非常有價值,在集成測試期間尤其有用。

跟蹤宏 ,提供帶有源代碼鏈接的消息, 運行時調用信息信息以及帶參數值的函數原型信息:

擴展跟蹤 :Win32的跟蹤宏

Windows事件TRACE宏的潛在替代品,具體取決於您的特定方案。 代碼被編譯為Debug和Release配置。 然后,可以動態啟用和禁用事件跟蹤,實時顯示或轉儲到客戶端的計算機上以供以后診斷。 跟蹤可以與從OS的其他部分收集的跟蹤信息相關聯。

如果您只需要在代碼到達某些檢查點時轉儲信息,以及可變內容,堆棧跟蹤或調用者名稱,Visual Studio的Tracepoints就是這樣做的非侵入式選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM