Как я могу определить, работает ли программа изнутри valgrind?

Есть ли способ идентифицировать во время выполнения исполняемого файла изнутри valgrind? У меня есть набор модульных тестов C ++, и один из них ожидает, std::vector::reserveчтобы бросить std::bad_alloc. Когда я запускаю это в valgrind, он полностью выручает, не давая мне возможности проверить утечки памяти (используя valgrind) и поведение (ожидая, что будет сгенерировано исключение).

Вот минимальный пример, который воспроизводит это:

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

Запустив valgrind, я получаю следующий вывод:

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)

Я хотел бы изменить мой модульный тест, чтобы просто пропустить нарушающий код, когда он запускается из Valgrind. Это возможно?

13.12.2008 17:18:29
2 ОТВЕТА
РЕШЕНИЕ

Вы должны посмотреть на эту страницу из руководства Valgrind, она содержит RUNNING_ON_VALGRINDмакрос (включенный из valgrind.h), который делает то, что вы хотите.

20
13.12.2008 21:48:22
Спасибо за это, я использовал * grind в течение многих лет, но вряд ли коснулся интерфейса. Легко сделать разумным включение этого макроса в autoconf .., который автоматически включает мою отладочную функцию printfs () и утверждения при запуске под valrgind, если присутствует valgrind / valgrind.h :) Еще раз спасибо! Очень полезно
Tim Post♦ 9.01.2009 07:40:14

Я посмотрел на вальгриндовскую документацию и не нашел простого ответа. Но вот несколько вещей, которые вы можете попробовать:

  • Напишите свою собственную оболочку вокруг новой операции, вызывающей ошибку, и сгенерируйте исключение, прежде чем valgrind запустит свою новую функцию.

  • Попробуйте, как предложено выше, за исключением того, что вместо параметра командной строки (который требует сантехники) используйте переменную окружения:

    MYAPP_UNIT_TESTS_DISABLED="NEW_MINUS_ONE,FLY_TO_MOON,DEREF_NULL" valgrind myapp

Тогда вы можете легко написать функцию

bool unit_test_enabled(const char *testname);

чтобы защитить ваш модульный тест на основе значения, возвращаемого getenv (3).

1
13.12.2008 19:54:42
есть хороший ответ, но иногда работают и простые
Erik Aronesty 7.02.2020 20:55:24