【问题标题】:Locking Output to Output Window in Visual Studio在 Visual Studio 中将输出锁定到输出窗口
【发布时间】:2011-05-24 20:52:59
【问题描述】:

我的应用程序使用 TRACE 宏将调试数据发送到 Visual Studio 中的输出窗口。其中一些输出字符串是通过多次调用TRACE 宏来构建的,如下面的sn-p 代码所示:

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?谢谢。

【问题讨论】:

    标签: c++ visual-studio visual-studio-2008 winapi trace


    【解决方案1】:

    我认为没有办法在 Visual Studio 中锁定输出窗口。我认为最简单的方法是将整个消息构建到 std::stringstreamwchar_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());
    

    【讨论】:

    • @JaredPar:谢谢。它有点工作,但我现在在输出窗口中得到了一些奇怪的输出。看看这个屏幕截图 (tinypic.com/r/2v9b588/7)。奇怪的字体是输出字符串的位置,但字符串中唯一显示的部分是函数名,其余部分是乱码。
    • @Jim 看起来问题是 unicode 和 ASCII 的混合。我会尝试wstringstream 看看是否能解决问题
    • @Jim Fell,奇怪的输出是因为它将字节视为字符。简单的解决方法是将 pMsg[i] 转换为 int。此外,由于您似乎试图以十六进制输出,因此在输出值之前不要忘记 std::hex 修饰符。
    • @JaredPar:谢谢。我把它改成了wstringstream,现在效果更好了。如果我在TRACE 宏处设置断点,我可以在stream._Stringbuffer._Seekhigh 处看到格式化字符串,并且在“内存”窗口中查看时,该字符串似乎不是以空值结尾的。我试过stream &lt;&lt; "\r\n\0";stream &lt;&lt; "\r\n" &lt;&lt; endl; 没有成功。有什么想法吗?
    • @Jim,根据文档 stringstreamc_str 两者都应该返回 NULL 终止的字符串值。为什么你认为它不是空终止的?
    【解决方案2】:

    在使用 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 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多