Не уверен, что при работе под Valgrind лучше иметь другое поведение, поскольку цель Valgrind - утвердить ваше программное обеспечение в ожидаемом случае.
В любом случае, Valgrind делаетне изменяйте стек или символы, поскольку он (вид) эмулирует процессор, на котором работает ваша программа.Единственный способ обнаружить, что вы работаете под Valgrind - это наблюдать за его эффектами, то есть все медленно и не многопоточно в Valgrind.
Так, например, запустите тест, который порождает 3 потока, использующих общий FIFO (с мьютексом / блокировкой) и наблюдает за количеством полученных элементов.В реальном процессоре вы ожидаете, что 3 потока будут обрабатывать примерно одинаковое количество элементов за T
время, но при запуске под Valgrind один поток будет использовать почти все элементы за >>T
время.
Другая возможность - вызвать какой-нибудь известный системный вызов.У Valgrind есть некоторые правила для наблюдения syscall.Например, если вы выделяете память, то Valgrind перехватит этот блок памяти и заполнит эту область памяти некоторыми данными.В хорошем программном обеспечении вы не должны читать эти данные и сначала записывать их (поэтому перезаписываете то, что установил Valgrind).Если вы попытаетесь прочитать эти данные и увидеть ненулевое значение, вы получите сообщение Valgrind invalid read of size XXX
, но ваш код будет знать, что он инструментирован.
Наконец, (и я думаю, что это намного проще),Вы должны переместить код, который вы хотите использовать в библиотеке, и иметь 2 интерфейса.«Официальный» интерфейс и тестовый интерфейс, где вы отключили все навороты, которые должны работать под Valgrind.