2011-09-19 11 views
15

Podczas jednej z moich ostatnich dyskusji z moim przełożonym wspomniał, że jeden z jego byłych klientów użył makra C++ do rejestrowania informacji o każdej linii kodu. Wszystko, co musieli zrobić, to włączyć zmienną środowiskową przed rozpoczęciem biegu. (Oczywiście zmienna środowiskowa została włączona w sam test-bedMakro C++ do rejestrowania każdej linii kodu

Dziennik wspomniano zbyt zmienne wykorzystywane i odpowiadające im wartości Na przykład dla linii:..

a = a + b; 

Dziennik powie coś takiego:

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

Osobiście nie był pewien, czy było to możliwe, ale był bardzo pewny tego że istniał, jakby nie pamiętał specyfikę kodu

.

Oto pytanie (oczywiste): czy to możliwe? Czy możesz podać kod dla tego?

+0

w swoim pytaniu, ja zawijania cudzysłowów dla wiadomości dziennika (aby zobaczyć, że jest to wiadomość log). Mam nadzieję, że jest w porządku. – iammilind

+0

Nie ma czegoś takiego jak makro C++, a to na pewno nie jest możliwe w przypadku makr preprocesorów wanilii C. Inne narzędzie musi generować ciągi wartości. – spraff

+1

Nie sądzę, że możliwe jest zalogowanie gołych linii, takich jak "a = a + b", ale użycie makra w linii "LOG (a = a + b)" jest możliwe, a makra assert już to robią. – Dialecticus

Odpowiedz

18

Nie wiem, czy każda linia/zmienna może być rozszerzona w ten sposób, ale wywołania funkcji mogą być rejestrowane. Zalogowałem wszystkie wywołania funkcji za pomocą opcji gcc na -finstrument-functions. Będzie to nazwać:

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

i

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

dla funkcji wejść i wyjść.

The docs explain how to use it. Nie wiem, czy inne kompilatory oferują coś podobnego.

+2

+1 dla interesującego znalezienia – trojanfoe

+1

MSVC++ ma '/ Gh' i'/GH' dla '_penter()' oraz funkcje '_pexit()', które są wywoływane odpowiednio na początku i na końcu każdej funkcji: http://msdn.microsoft.com/en-us/library/c63a9b7h.aspx –

0

Możesz sprawdzić, jak BOOST_CHECKA from Boost.Test is implemented. Wewnętrznie używa szablonów ekspresji.

do badań:

#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); 
} 

wyjścia:

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" 

Uwaga wartości w nawiasach: [! 0 + 1 = 2]

ma pewne ograniczenia.

Do testu:

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

wyjście jest:

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