Макрос С++ для регистрации каждой строки кода
Во время одного из моих недавних обсуждений с моим менеджером он упомянул, что один из его бывших клиентов использовал макрос С++ для регистрации информации о каждой строке кода. Все, что им нужно было сделать, это включить переменную окружения перед запуском. (Конечно, переменная окружения была включена только в тестовом посте.
В журнале упоминаются используемые переменные и их соответствующие значения.
Например, для строки:
a = a + b;
В журнале будет сказано что-то вроде:
"a = a + b; (a = 5 + 3)"
Лично я не был уверен, что это возможно, но он был очень уверен в этом, хотя он не помнил специфику кода.
Итак, вот (очевидный) вопрос: возможно ли это? Можете ли вы предоставить код для этого?
Ответы
Ответ 1
Я не знаю, может ли каждая строка/переменная быть расширена так, но вызовы функций могут быть зарегистрированы. Я выполнил все вызовы функций, используя опцию -finstrument-functions
gcc. Он будет вызывать:
void __cyg_profile_func_enter (void *this_fn, void *call_site);
и
void __cyg_profile_func_exit (void *this_fn, void *call_site);
для входа и выхода функции.
Документы объясняют, как его использовать. Я не знаю, предлагают ли другие компиляторы что-то подобное.
Ответ 2
Вы можете проверить, как BOOST_CHECKA из Boost.Test реализован. Внутри он использует шаблоны выражений.
Для теста:
#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]