¿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?
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 –