2011-09-19 13 views
15

Durante una de mis recientes conversaciones con mi gerente, mencionó que uno de sus clientes anteriores usó una macro C++ para registrar información sobre cada línea de código. Todo lo que tenían que hacer era habilitar una variable de entorno antes de comenzar la ejecución. (Por supuesto, la variable de entorno se habilitó en el banco de pruebas soloMacro C++ para registrar cada línea de código

El registro menciona las variables utilizadas y sus valores correspondientes demasiado Por ejemplo, la línea:..

a = a + b; 

El registro dirían algo así como:

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

En lo personal, yo no estaba seguro de si esto era posible, pero estaba muy seguro de que esto haya existido, aunque no recordaba los detalles del código

.

Entonces, aquí está la pregunta (obvia): ¿Es esto posible? ¿Puedes proporcionar el código para este?

+0

En su pregunta, estoy envolviendo comillas dobles para el mensaje de registro (para demostrar que se trata de un mensaje de registro). Espero que esté bien. – iammilind

+0

No existe una macro C++, y esto ciertamente no es posible con las macros preprocesador C de vanilla. Alguna otra herramienta debe generar las cadenas de valor. – spraff

+1

No creo que sea posible registrar líneas simples como "a = a + b", pero usar una macro en la línea como "LOG (a = a + b)" es posible, y assert macro ya lo está haciendo. – Dialecticus

Respuesta

18

No sé si cada línea/variable se puede expandir de esa manera, pero las llamadas a funciones se pueden registrar. He registrado todas las llamadas a funciones usando la opción -finstrument-functions de gcc. Se llamará:

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

y

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

para la función de entrar y salir.

The docs explain how to use it. No sé si otros compiladores ofrecen algo similar.

+2

1 para encontrar interesante – trojanfoe

+1

MSVC++ tiene '/ Gh' y'/'GH' para _penter()' y '_pexit()' funciones, las cuales serán llamadas en el comienzo y final de cada función, respectivamente: http://msdn.microsoft.com/en-us/library/c63a9b7h.aspx –

0

Puede verificar cómo BOOST_CHECKA from Boost.Test is implemented. Internamente utiliza plantillas de expresión.

Para la prueba:

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

de salida es:

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" 

valores de las notas entre corchetes: [0 + 1 = 2]

tiene algunas limitaciones.

Para la prueba:

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

salida es:

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