Я пишу регрессионный тест для оптимизируемой подпрограммы (Win7) C ++, которая ранее освобождала и перераспределяла множество гигантских буферов: отток памяти. Я хотел бы доказать, что во время теста программа не выделяет большие области памяти (скажем, 16M или больше), но вместо этого эффективно повторно использует свою память, которая была выделена во время инициализации. Это сводится к тому, что тест должен провалиться, если VirtualAlloc был вызван для получения какого-то большого региона (скажем, 16M).
Существует ли элегантный способ подсчета статистики по вызовам в Windows VirtualAlloc? Это станет частью постоянного набора автоматических регрессионных тестов, поэтому использование внешнего инструмента или изменение нижестоящего кода нецелесообразно.
Проверка общего объема выделенной памяти не подходит, потому что я хочу утверждать, что процедура больше не работает (освобождает и перераспределяет буферы).
Обходы может перехватывать произвольные вызовы методов, но
Rohitab а также Easyhook кажется, предоставить что-то подобное.
Если ваш процесс 32-битный, вы можете выделить 4080 МБ (больше или меньше) заранее, и больше вызовов VirtualAlloc не удастся. Это не распространяется на случаи, когда вы выделяете / освобождаете 16 МБ несколько раз. Если вы зарезервируете эти 4080 МБ, это будет даже быстро, поскольку не требуется никакой реальной памяти.
Внедрение зависимости.
Вместо того, чтобы тестируемый код вызывал собственные распределители памяти, вы передаете указатель на объект распределителя, который может использовать код. Для производственного кода этот объект распределителя просто вызывает собственные функции выделения памяти. Для теста вы передаете распределитель, который проверяет и / или регистрирует размеры.