Как реализовать инструмент покрытия кода с помощью Win32 Debugging API - PullRequest
2 голосов
/ 07 апреля 2009

Я пытаюсь понять, как реализовать инструмент покрытия кода с помощью API отладки Win32.

Я думал об использовании Win32 Debugging API для запуска процесса в режиме отладки - и отслеживания того, какие инструкции ЦП были выполнены. После отслеживания всех инструкций ЦП я бы использовал файл карты, чтобы сопоставить его с тем, какие строки исходного кода были выполнены.

Насколько я понимаю, было бы два способа узнать, какие инструкции процессора выполнялись.

  1. Будет запускать процесс в режиме отладки - установить все потоки в одношаговом режиме и позволить приложению отладки записывать все выполненные инструкции

  2. Было бы более разумным подходом, когда вы узнали бы намного больше о командах x86 и в основном заменили бы следующую инструкцию ветвления точкой останова. Затем отслеживание дельта-инструкций между двумя точками останова.

Обновление - новые предложенные подходы, вдохновленные ответом Майкла:

  1. Начните с файла карты и вставьте точки останова в начале каждой строки и позвольте инфраструктуре отладки получать уведомления каждый раз, когда достигается точка останова.

  2. Начните с файла карты - двоичного инструментария для вставки «ловушки», которая вызывается при входе в каждую строку источника - избегая обратного вызова через инфраструктуру отладчика.

  3. Использование технологии VM - такой как VMware, чтобы узнать, какие инструкции были выполнены в конкретном процессе - я не полностью понимаю этот подход ...

Может ли кто-нибудь подтвердить один из вышеперечисленных подходов или предложить альтернативу - обратите внимание, что вариант использования - это построчное покрытие кода, а не профилирование производительности - поэтому нам нужно знать, посещена ли каждая отдельная строка источника.

Моя основная цель (хотя нет конкретного плана ...) заключалась бы в создании простого инструмента покрытия кода в первую очередь для Delphi.

Спасибо!

Ответы [ 3 ]

2 голосов
/ 07 апреля 2009

Один из подходов заключается в подключении всех вызовов API и вызовов функций для сравнения с таблицей, созданной из источника. Таким образом вы обнаруживаете, что покрыто.
Существует множество API для перехвата, один из них Траппола API перехват

1 голос
/ 26 июля 2011

Я бы посоветовал вместо каждой строки кода переходить к каждому блоку. Что я имею в виду, чтобы зацепить блок кодов. Это будет быстрее, и вы также можете узнать количество строк по числу блоков.

1 голос
/ 07 апреля 2009

Это может сработать - каждое одношаговое событие создаст исключение, и вы сможете записать IP-адрес попадания в вашу карту выполненных строк кода.

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

Основная проблема в том, что вы пытаетесь использовать отладчик в качестве инструмента покрытия кода, для которого он не предназначен. Быстрый поиск показывает несколько инструментов покрытия кода для Delphi в Интернете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...