【问题标题】:Debug C++ Runtime Component in a WP8 project在 WP8 项目中调试 C++ 运行时组件
【发布时间】:2014-02-18 01:00:41
【问题描述】:

我尝试了很多解决方案,但都没有奏效。

  • printf("测试:%d", 123);
  • std::cout
  • ...

实际上我已经像this 一样设置了我的项目的调试器,我可以使用OutputDebugStringA("Test"); 在控制台中编写,但是这个函数不接受多个参数。

如何打印这样的内容:("Test : %d", 123)

【问题讨论】:

    标签: c++ windows-phone-8 console windows-runtime visual-studio-debugging


    【解决方案1】:

    Bogy 的答案是正确的,但我不喜欢 GetWC 中看起来像内存泄漏的分配,并且它使用了不安全的函数,试试这个:

    void Debug::Log(const wchar_t *format, ...)
    {
        wchar_t buffer[BUFFER_LENGTH];
        va_list args;
        va_start(args, format);
        _vsnwprintf_s(buffer, BUFFER_LENGTH, _TRUNCATE, format, args);
        va_end(args);
        buffer[BUFFER_LENGTH - 1] = '\0'; //prevent buffer overflow
        OutputDebugString(buffer);
    }
    

    用法如下:

    Debug::Log(L"Hello %S\n", "sailor");
    

    【讨论】:

      【解决方案2】:

      我在 Pluralsight 上的 C++ training 中找到了这段代码,我正在用于 Windows 8(您只需说 TRACE("Test : %d", 123); 即可使用它):

      #pragma once
      #include <assert.h>
      
      #define ASSERT assert
      
      #ifdef _DEBUG
      inline auto Trace(wchar_t const * format, ...) -> void
      {
          va_list args;
          va_start(args, format);
      
          wchar_t buffer[256];
      
          ASSERT(-1 != _vsnwprintf_s(buffer, _countof(buffer) - 1, format, args));
          va_end(args);
      
          OutputDebugString(buffer);
      }
      #endif
      
      struct Tracer
      {
          char const * m_filename;
          unsigned m_line;
      
          Tracer(char const * filename, unsigned const line) :
              m_filename{ filename },
              m_line{ line }
          {
      
          }
      
          template <typename... Args>
          auto operator()(wchar_t const * format, Args... args) const -> void
          {
              wchar_t buffer[256];
      
              auto count = swprintf_s(buffer, L"%S(%d): ", m_filename, m_line);
      
              ASSERT(-1 != count);
      
              ASSERT(-1 != _snwprintf_s(buffer + count, _countof(buffer) - count, _countof(buffer) - count - 1, format, args...));
      
              OutputDebugString(buffer);
          }
      };
      
      #ifdef _DEBUG
      #define TRACE Tracer(__FILE__, __LINE__)
      #else
      #define TRACE __noop
      #endif
      

      【讨论】:

      • 看来Visual Studio 2013 不支持可变参数模板:(
      • 嗯,我在 Win 8.1 项目中使用了 VS2013。也许它需要已经发布的更新 1?
      • 我在我的 Mac 上使用虚拟化的 Windows 8(使用 Parallel Desktop 8)并且我不想升级到 8.1,因为 VM 不完全兼容...
      【解决方案3】:

      我终于找到了这个解决方案(herehere):

      调试.cpp:

      #pragma once
      
      #include "pch.h"
      #define BUFFER_LENGTH 1024
      
      //char* to wchar_t*
      const wchar_t *GetWC(const char *c)
      {
          const size_t cSize = strlen(c) + 1;
          wchar_t* wc = new wchar_t[cSize];
          mbstowcs(wc, c, cSize);
      
          return wc;
      }
      
      void Debug::Log(const char *format, ...)
      {
          char buffer[BUFFER_LENGTH];
          va_list args;
          va_start(args, format);
          vsnprintf(buffer, BUFFER_LENGTH, format, args);
          va_end(args);
          buffer[BUFFER_LENGTH - 1] = '\0'; //prevent buffer overflow
          OutputDebugString(GetWC(buffer));
      }
      

      调试.h:

      class Debug{
      public:
          static void Log(const char *format, ...);
      };
      

      我们可以像printf函数一样使用它:

      Debug::Log("Test : %d", 123);
      

      【讨论】:

        猜你喜欢
        • 2019-09-24
        • 1970-01-01
        • 2020-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-20
        • 2021-02-10
        相关资源
        最近更新 更多