Ищите способ обнаружить valgrind / memcheck во время выполнения, не включая заголовки valgrind - PullRequest
5 голосов
/ 10 апреля 2019

Valgrind / Memcheck может быть интенсивным и привести к значительному снижению производительности во время выполнения. Мне нужен способ (во время выполнения) обнаружить его, чтобы отключить все вспомогательные службы и функции, чтобы выполнить проверки менее чем за 24 часа. Я бы предпочел не передавать какие-либо явные флаги в программу, но это был бы один из способов.

  1. Я исследовал поиск в таблице символов (с помощью вызовов abi) для символов valgrind или memcheck, но их не было.
  2. Я исследовал проверку стека (через boost :: stacktrace), но там тоже ничего не было.

1 Ответ

0 голосов
/ 10 апреля 2019

Не уверен, что при работе под Valgrind лучше иметь другое поведение, поскольку цель Valgrind - утвердить ваше программное обеспечение в ожидаемом случае.

В любом случае, Valgrind делаетне изменяйте стек или символы, поскольку он (вид) эмулирует процессор, на котором работает ваша программа.Единственный способ обнаружить, что вы работаете под Valgrind - это наблюдать за его эффектами, то есть все медленно и не многопоточно в Valgrind.

Так, например, запустите тест, который порождает 3 потока, использующих общий FIFO (с мьютексом / блокировкой) и наблюдает за количеством полученных элементов.В реальном процессоре вы ожидаете, что 3 потока будут обрабатывать примерно одинаковое количество элементов за T время, но при запуске под Valgrind один поток будет использовать почти все элементы за >>T время.

Другая возможность - вызвать какой-нибудь известный системный вызов.У Valgrind есть некоторые правила для наблюдения syscall.Например, если вы выделяете память, то Valgrind перехватит этот блок памяти и заполнит эту область памяти некоторыми данными.В хорошем программном обеспечении вы не должны читать эти данные и сначала записывать их (поэтому перезаписываете то, что установил Valgrind).Если вы попытаетесь прочитать эти данные и увидеть ненулевое значение, вы получите сообщение Valgrind invalid read of size XXX, но ваш код будет знать, что он инструментирован.

Наконец, (и я думаю, что это намного проще),Вы должны переместить код, который вы хотите использовать в библиотеке, и иметь 2 интерфейса.«Официальный» интерфейс и тестовый интерфейс, где вы отключили все навороты, которые должны работать под Valgrind.

...