Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Тестирование покрытия кода в Delphi 2007: использование MAP-файлов для инструкций INT3

Delphi , Синтаксис , Справочник по API-функциям

В статье рассматривается подход к созданию инструмента для тестирования покрытия кода в среде разработки Delphi 2007. Основная идея заключается в использовании Win32 Debug API для вставки и последующего удаления точек останова для каждой строки исходного кода, что позволяет отслеживать выполнение кода.

Описание проблемы

При разработке инструмента для тестирования покрытия кода в Delphi 2007 был выбран следующий алгоритм:

  1. Парсинг подробного MAP-файла для нахождения адресов каждой строки исходного кода, относящейся к сегменту .text.
  2. Запуск приложения в режиме отладки с использованием API вызова OpenProcess.
  3. Итерация по каждой строке исходного кода и вставка инструкции INT3 ($cc байт) с использованием WriteProcessMemory и FlushInstructionCache по адресу каждой строки.
  4. Продолжение выполнения программы и удаление точек останова при их срабатывании, что позволяет отметить строку как выполненную.
  5. По завершении работы программы или после прохождения всех точек останова, генерация отчета о покрытии кода для каждого модуля исходного кода.

Вопрос, который возник в процессе разработки: являются ли все адреса строк исходного кода в подробном MAP-файле валидными для вставки инструкции INT3? Автор столкнулся с нарушениями доступа при работе с более крупными приложениями, где адреса, вызывающие ошибки, содержали байт $cc.

Подтвержденный ответ

В теории, да, адреса строк исходного кода в MAP-файле должны быть валидными для вставки инструкции INT3. На практике это также должно быть верно, если Delphi может устанавливать точки останова на каждой строке. Однако, возможно, потребуется специальная обработка некоторых случаев, например, при наличии ассемблерного кода, где первая строка процедуры может содержать инициализацию локальных переменных и установку регистра EBP.

Альтернативный ответ

Не все строки исходного кода содержат исполняемый код. Например, функция System._LStrToPChar содержит данные в сегменте кода. Если исключить из обработки модули, содержащие ассемблерный код, проблема все еще будет возникать. Важно уметь определить, является ли код по указанному адресу началом инструкции.

Пример кода

procedure TForm1.Button1Click(Sender: TObject);
var
  MapFile: TFileOfString;
  Address: PChar;
begin
  // Инициализация чтения MAP-файла
  MapFile := TFileOfString.Create('path_to_map_file');
  try
    // Парсинг MAP-файла и вставка INT3 по адресам
    while not MapFile.EOF do
    begin
      Address := MapFile.ReadLn;
      // Здесь должен быть код для вставки INT3 по адресу, указанному в MAP-файле
    end;
  finally
    MapFile.Free;
  end;
end;

Заключение

Автор инструмента смог выявить и устранить проблему, связанную с несоответствием адресов в MAP-файле и фактическими адресами модулей. После устранения этой ошибки, подход стал работать для модулей без ассемблерного кода. В будущем автор планирует опубликовать свой инструмент с открытым исходным кодом для сообщества.


В данной статье был представлен подход к созданию инструмента для тестирования покрытия кода в Delphi 2007 с использованием MAP-файлов и инструкций INT3. Обсуждались возможные трудности и пути их решения.

Создано по материалам из источника по ссылке.

В статье рассматривается метод тестирования покрытия кода в Delphi 2007 с использованием MAP-файлов и вставкой инструкций INT3 для отслеживания выполнения кода, а также анализируются проблемы валидности адресов для вставки этих инструкций.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-13 18:51:27/0.0056090354919434/1