在WP8项目中调试C ++运行时组件

时间:2014-02-18 01:00:41

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

我尝试了很多解决方案,但没有一个能够正常工作。

  • printf(“Test:%d”,123);
  • std :: cout<< “测试”<< 123<<的std :: ENDL;
  • ...

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

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

3 个答案:

答案 0 :(得分:2)

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");

答案 1 :(得分:0)

我在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

答案 2 :(得分:0)

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

Debug.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));
}

Debug.h:

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

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

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