2008-12-13 26 views
5

¿Hay alguna forma de identificar en tiempo de ejecución que un ejecutable se esté ejecutando desde valgrind? Tengo un conjunto de pruebas de unidades de C++, y una de ellas espera que std::vector::reserve arroje std::bad_alloc. Cuando ejecuto esto bajo valgrind, rescata por completo, lo que me impide probar tanto las fugas de memoria (usando valgrind) como el comportamiento (esperando que se produzca la excepción).¿Cómo puedo detectar si un programa se está ejecutando desde dentro de valgrind?

He aquí un ejemplo mínimo que lo reproduce:

#include <vector> 
int main() 
{ 
    size_t uint_max = static_cast<size_t>(-1); 
    std::vector<char> v; 
    v.reserve(uint_max); 
} 

Correr valgrind, consigo esta salida:

Warning: silly arg (-1) to __builtin_new() 
new/new[] failed and should throw an exception, but Valgrind 
    cannot throw exceptions and so is aborting instead. Sorry. 
    at 0x40192BC: VALGRIND_PRINTF_BACKTRACE (valgrind.h:319) 
    by 0x401C823: operator new(unsigned) (vg_replace_malloc.c:164) 
    by 0x80487BF: std::vector<char, std::allocator<char> >::reserve(unsigned) new_allocator.h:92) 
    by 0x804874D: main (vg.cxx:6) 

Me gustaría modificar mi prueba de la unidad simplemente omitir el código infractor en el momento se está ejecutando desde dentro de valgrind. es posible?

Respuesta

16

Debería mirar this page del manual de Valgrind, contiene una macro RUNNING_ON_VALGRIND (incluida en valgrind.h) que hace lo que quiere.

+0

Gracias por esto, he estado usando * Grind durante años pero casi no he tocado la interfaz. Es fácil hacer cordura para incluir esa macro en autoconf .. que automáticamente activa mi depuración printfs() y aserciones cuando se ejecuta bajo valrgind si valgrind/valgrind.h está presente :) ¡Gracias de nuevo! Muy útil –

0

Miré la documentación de valgr y no encontré una respuesta fácil. Pero aquí hay un par de cosas que usted puede probar:

  • Escribe tu propio envoltorio alrededor del infractor nueva operación y elevar la excepción antes valgrind obtiene su nueva función privada va.

  • Try como cartel anterior sugirió excepto que en lugar de una opción de línea de comandos (que requiere de plomería) utiliza una variable de entorno:

    MYAPP_UNIT_TESTS_DISABLED="NEW_MINUS_ONE,FLY_TO_MOON,DEREF_NULL" valgrind myapp 
    

entonces usted puede escribir fácilmente una función

bool unit_test_enabled(const char *testname); 

para proteger su unidad de prueba según el valor devuelto por getenv (3).

Cuestiones relacionadas