有没有比#if DebugMode更好的方法来记录

时间:2010-04-15 04:50:46

标签: c++ logging debugging

我正在制作一个c ++库,它将从c#调用P / Invoke,所以我无法断点/调试c ++方面的东西。所以我决定添加日志记录,以便我可以看到是否出现任何问题以及发生了什么。我添加#define DebugMode 1以确定我是否要记录。 首先,我不是很擅长c ++,但我知道足够的解决方案。所以我的问题是:

  1. 有没有比围绕每个日志调用包裹#if DebugMode #endif更好的方法?我可以简单地在Log方法中执行此操作,如果未启用日志记录则返回但是这并不意味着所有这些日志字符串都将在程序集中?

  2. 我如何模仿printf使用“...”运算符执行的操作,使我能够传递Log("Variable x is {0}", x);

  3. 之类的内容
  4. 是否有任何技巧可以获取我可以在日志中使用的某种行号或堆栈跟踪信息?

  5. 谢谢!

4 个答案:

答案 0 :(得分:5)

一种简单的方法是只定义一个宏,如果你没有处于调试模式,它什么都不做。这样您就不必将所有呼叫都包裹在#ifdef中。

一个简单的实现可能是:

#if DebugMode
#define MY_LOG(string, ...) printf(string, __VA_ARGS__)
#else
#define MY_LOG(string, ...)
#endif

还有其他方法和库(例如boost),但这会让你快速得到一些东西。

答案 1 :(得分:2)

如果条件是编译时常量,那么你的代码(在预处理之后)可以解决类似的问题:

if (0) 
    do the logging

然后编译器通常会足够聪明地删除死代码,包括传递给它的字符串(除非您还使用了其他代码中未被删除的字符串)。

像printf这样的代码非常简单:

#include <stdarg.h>

void log(char const &fmt, ...) { 
    if (do_logging) {
        va_list args;

        va_start(args, fmt);
        vfprintf(output_file, fmt, args);
    }
}

在宏(重要的是它在宏中,而不是被调用的函数)中,您可以使用__FILE____LINE__将当前行号和源文件名放入日志中。使用上面的代码,您(可能)想要在格式字符串之前传递它们。

答案 2 :(得分:2)

我建议使用Pantheios,然后你永远不需要关心DEBUG /!DEBUG。该库使用C ++模板来确保在未启用日志记录时不会支付任何性能成本。它也是100%类型安全的,可扩展到用户定义的类型。

bar_t  bar;

pantheios::log_DEBUG("foo ", bar, " was doing something you should remember");

查看他们的performance page以获取更多信息。

答案 3 :(得分:0)

调试C ++库怎么样?在C ++库Project Properties,Debugging中,在Command字段中选择C#client,然后开始调试。

关于日志记录,您是否询问C ++或C#日志记录? Bot只有在Debug配置中定义的预处理器常量,你可以使用它。