C ++ макрос для записи каждой строки кода - PullRequest
16 голосов
/ 19 сентября 2011

Во время одного из моих недавних обсуждений с моим менеджером он упомянул, что один из его бывших клиентов использовал макрос C ++ для записи информации о каждой строке кода. Все, что им нужно было сделать - это включить переменную среды перед запуском. (Конечно, переменная окружения была включена только на тестовом стенде.

В журнале упоминаются используемые переменные и их соответствующие значения. Например, для строки:

a = a + b;

В журнале будет что-то вроде:

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

Лично я не был уверен, возможно ли это, но он был очень уверен в существовании этого, хотя он не помнил специфику кода.

Итак, вот (очевидный) вопрос: возможно ли это? Можете ли вы предоставить код для этого?

Ответы [ 2 ]

18 голосов
/ 19 сентября 2011

Я не знаю, может ли каждая строка / переменная быть расширена таким образом, но вызовы функций могут быть зарегистрированы. Я зарегистрировал все вызовы функций, используя опцию -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);

для функции входа и выхода.

Документы объясняют, как его использовать. Я не знаю, предлагают ли другие компиляторы нечто подобное.

0 голосов
/ 24 октября 2012

Вы можете проверить, как 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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...