我的应用程序使用TRACE
宏将调试数据发送到Visual Studio中的输出窗口。其中一些输出字符串是使用对TRACE
宏的多次调用构建的,如下面的代码片段所示:
BYTE i, len;
len = pMsg[APP_LEN_OFFSET] + sizeof(appPktHead_t) - APP_MSG_CODE_LEN;
TRACE(_T("%s: "), fnName);
TRACE(GetCmdIdStr( pMsg[APP_MSG_CODE_OFFSET] ));
TRACE(_T(" 0x"));
for ( i = 0; i < len; i++ )
{
TRACE(_T("%.2X "), pMsg[i]);
}
TRACE(_T("\r\n"));
如何在此功能期间将输出锁定到输出窗口,或者通过一次调用将整个字符串发送到TRACE
?感谢。
答案 0 :(得分:2)
我不相信有办法在Visual Studio中锁定输出窗口。我认为最简单的方法是将整个邮件构建到std::stringstream
或wchar_t[]
对象中,然后将该单个值输出到TRACE
宏
自从我使用stringstream
以来已经有一段时间了,所以这里可能会有一些错误,但以下情况应该会让您走上正轨
std::stringstream stream;
stream << fnName << ": ";
stream << GetCmdIdStr( pMsg[APP_MSG_CODE_OFFSET] );
stream << " 0x";
for ( i = 0; i < len; i++ )
{
stream << pMsg[i] << " ";
}
stream << "\r\n";
TRACE(stream.str().c_str());
答案 1 :(得分:1)
在使用TRACE
宏之前构建一个字符串。
byMsgLen = pMsg[DEV_LEN_OFFSET] + sizeof(devPktHead_t) + sizeof(devPktTail_t);
cmd = pMsg[DEV_CMD_MSB_OFFSET];
cmd <<= 8;
cmd |= pMsg[DEV_CMD_LSB_OFFSET];
pCmdIdStr = GetCmdIdStr( cmd );
iPreOffset = ::wcsnlen_s(fnName, 128) // function name
+ 2 // ": "
+ ::wcsnlen_s(pCmdIdStr, 128) // command ID string
+ 3; // " 0x"
iPostOffset = iPreOffset + byMsgLen * 3; // "%.2X " (formatted: 2 hex-nibble bytes and space)
iStrLen = iPostOffset + 3; // "\r\n\0"
pBuf = (wchar_t *)malloc( iStrLen * sizeof(wchar_t) );
::swprintf_s( pBuf, iStrLen, _T("%s: %s 0x"), fnName, pCmdIdStr);
for ( i = iPreOffset; i < iPostOffset; i += 3 )
{
::swprintf_s( &(pBuf[i]), 4, _T("%.2X "), pMsg[j++] );
}
::swprintf_s( &(pBuf[i]), 3, _T("\r\n") );
TRACE( pBuf );
::free( pBuf );