【问题标题】:C++ macro to log every line of code用于记录每一行代码的 C++ 宏
【发布时间】:2011-11-20 01:55:45
【问题描述】:

在我最近与经理的一次讨论中,他提到他的一位前客户使用 C++ 宏来记录有关每一行代码的信息。他们所要做的就是在开始运行之前启用一个环境变量。 (当然,环境变量是在测试台中单独启用的。

日志也提到了使用的变量及其对应的值。 例如,对于该行:

a = a + b;

日志会这样写:

"a = a + b; (a = 5 + 3)"

就我个人而言,我不确定这是否可能,但他非常确定这已经存在,尽管他不记得代码的细节。

所以,这是一个(显而易见的)问题:这可能吗?你能提供这个的代码吗?

【问题讨论】:

  • 在您的问题中,我为日志消息加上双引号(以表明它是日志消息)。希望没事。
  • 没有像 C++ 宏这样的东西,这对于普通的 C 预处理器宏当然是不可能的。必须有其他工具生成值字符串。
  • 我认为不可能记录像“a = a + b”这样的裸行,但是可以在像“LOG(a = a + b)”这样的行中使用宏,并且断言宏已经在这样做了。
  • 这可能提供什么价值?当然最好在调试器中运行以获取此信息...
  • 我认为编写一个将每一行代码放在 LOG() 宏之间的自定义预处理器并不难

标签: c++ c logging macros


【解决方案1】:

我不知道是否每个行/变量都可以这样扩展,但可以记录函数调用。我已经使用 gcc 的 -finstrument-functions 选项记录了所有函数调用。它会调用:

  void __cyg_profile_func_enter (void *this_fn, void *call_site);

   void __cyg_profile_func_exit  (void *this_fn, void *call_site);

函数进入和退出。

The docs explain how to use it.我不知道其他编译器是否提供类似的东西。

【讨论】:

【解决方案2】:

您可以查看BOOST_CHECKA from Boost.Test is implemented。它在内部使用表达式模板。

测试用:

#define BOOST_TEST_MAIN

#include <boost/test/included/unit_test.hpp>
#include <boost/test/test_tools.hpp>

BOOST_AUTO_TEST_CASE(test1)
{
    int a=0;
    int b=1;
    int c=2;
    BOOST_CHECKA( a+b == c );
}

输出是:

Running 1 test case...
main.cpp(11): error: in "test1": check a+b == c failed [0+1!=2]

*** 1 failure detected in test suite "Master Test Suite"

注意方括号中的值:[0+1!=2]

它有一些限制。

测试用:

BOOST_CHECKA( (a+b) == c );

输出是:

check (a+b) == c failed [1!=2]

【讨论】:

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