C ++宏记录每行代码

时间:2011-09-19 09:04:24

标签: c++ c logging macros

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

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

a = a + b;

日志会说:

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

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

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

2 个答案:

答案 0 :(得分:18)

我不知道是否可以像这样扩展每一行/变量,但可以记录函数调用。我已使用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.我不知道其他编译器是否提供类似的东西。

答案 1 :(得分:0)

您可以查看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]