Как регрессионный тест может доказать, был ли вызван VirtualAlloc?

Я пишу регрессионный тест для оптимизируемой подпрограммы (Win7) C ++, которая ранее освобождала и перераспределяла множество гигантских буферов: отток памяти. Я хотел бы доказать, что во время теста программа не выделяет большие области памяти (скажем, 16M или больше), но вместо этого эффективно повторно использует свою память, которая была выделена во время инициализации. Это сводится к тому, что тест должен провалиться, если VirtualAlloc был вызван для получения какого-то большого региона (скажем, 16M).

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

Проверка общего объема выделенной памяти не подходит, потому что я хочу утверждать, что процедура больше не работает (освобождает и перераспределяет буферы).

1

Решение

Зацепление

Обходы может перехватывать произвольные вызовы методов, но

  • это бесплатно только для некоммерческого использования
  • это возможно излишне для юнит-теста

Rohitab а также Easyhook кажется, предоставить что-то подобное.

альтернативы

Если ваш процесс 32-битный, вы можете выделить 4080 МБ (больше или меньше) заранее, и больше вызовов VirtualAlloc не удастся. Это не распространяется на случаи, когда вы выделяете / освобождаете 16 МБ несколько раз. Если вы зарезервируете эти 4080 МБ, это будет даже быстро, поскольку не требуется никакой реальной памяти.

1

Другие решения

Внедрение зависимости.

Вместо того, чтобы тестируемый код вызывал собственные распределители памяти, вы передаете указатель на объект распределителя, который может использовать код. Для производственного кода этот объект распределителя просто вызывает собственные функции выделения памяти. Для теста вы передаете распределитель, который проверяет и / или регистрирует размеры.

1

По вопросам рекламы [email protected]