Pregunta

¿Hay una manera de identificar en tiempo de ejecución de un ejecutable está siendo dirigido desde dentro valgrind? Tengo un conjunto de pruebas de unidad C ++, y uno de ellos espera std::vector::reserve a tirar std::bad_alloc. Cuando ejecuto esto bajo valgrind, se rescata por completo, me impide analizar a la vez pérdidas de memoria (utilizando valgrind) y el comportamiento (esperando la excepción que se lance).

Este es 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);
}

Running 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 saltarse el código erróneo cuando está siendo ejecutado desde dentro valgrind. ¿Es esto posible?

¿Fue útil?

Solución

Usted debe mirar esta página del manual de Valgrind, que contiene una macro RUNNING_ON_VALGRIND (incluido desde valgrind.h), que hace lo que quiere.

Otros consejos

Miré el doucmentation valgrind y no encontrar una respuesta fácil. Pero aquí hay un par de cosas que usted puede probar:

  • Escriba su propio envoltorio alrededor del infractor nueva operación y elevar la excepción antes valgrind obtiene su nueva función privada en marcha.

  • Trate como cartel encima sugerido excepto que en lugar de una opción de línea de comandos (que requiere de plomería) utilizar una variable de entorno:

    MYAPP_UNIT_TESTS_DISABLED="NEW_MINUS_ONE,FLY_TO_MOON,DEREF_NULL" valgrind myapp
    

A continuación, puede escribir fácilmente una función

bool unit_test_enabled(const char *testname);

para proteger su unidad de prueba basado en el valor devuelto por getenv (3).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top