Я пытаюсь создать инструмент покрытия кода, используя Delphi 2007.
Мой общий подход состоит в том, чтобы использовать Win32 Debug API для вставки точек останова для каждой строки исходного кода, а затем удалять точки останова по мере их прохождения - таким образом, я мог бы отслеживать каждую исполняемую строку источника.
Схема моего подхода:
- разобрать подробный файл MAP (созданный Delphi 2007), чтобы найти все адреса для каждой строки исходного текста (только для сегментов .text)
- открыть приложение в режиме отладки с помощью вызова API OpenProcess
- перебирает каждую строку исходного текста и вставляет инструкцию Int3 (один байт $ cc, используя WriteProcessMemory + FlushInstructionCache) по адресу каждой строки
- продолжить выполнение, и при срабатывании каждой точки останова удалите соответствующую точку останова и пометьте линию как покрытую
- После того, как каждая точка останова пройдена или программа существует, я генерирую отчет о том, какие строки были охвачены, а какие - не для каждого исходного модуля
Теперь на мой вопрос:
Является ли каждый адрес строки источника в подробном файле MAP действительным адресом для вставки точки останова Int3?
Несмотря на то, что подход был успешным для некоторых простых модулей, я запустил доступ к нарушениям для некоторых более крупных приложений, где нарушенный адрес содержит $ cc - что заставило бы меня думать, что мой подход нуждается в некоторой модификации для работы.
Советы по лучшим подходам также очень приветствуются!