Существует два типа механизмов сбора покрытия:
1) Выборка программного счетчика в реальном времени, обычно с помощью часов, работающих с интервалом 1-10 мс. Трудности: а) сопоставление фактического значения P C с исходной строкой, б) выборка означает, что вы можете не увидеть выполнения редко используемого фрагмента кода, поэтому ваши отчеты о покрытии неточны. Из-за этих проблем этот подход используется не очень часто.
2) Инструментирование программы таким образом, чтобы она собирала покрытие во время выполнения. Это сложно сделать с объектным кодом ... а) вам нужно декодировать инструкции, чтобы увидеть, где разместить зонды, и это может быть очень сложно сделать правильно, б) вы исправили исходный код, чтобы включить зонды (это может быть действительно неудобным: «зонд» может состоять из 5-байтового вызова подпрограммы, но зонд заменяет однобайтовую инструкцию). c) вам все еще нужно выяснить, как сопоставить местоположение зонда со строкой исходного кода. Более эффективный способ - инструментировать исходный код, что требует довольно сложного оборудования для чтения исходного кода, создания пробных исправлений и регенерации инструментального кода для выполнения / компиляции.
Мой технический документ Охват ветвей для произвольных Упрощенные языки предоставляет подробные сведения о том, как это сделать в общих чертах. Моя компания создала коммерческие инструменты покрытия тестов для самых разных языков (C, Python, PHP, COBOL, Java, C ++, C#, Pro C, ....), используя этот подход. Это охватывает большинство языков stati c и Dynami c. Некоторые механизмы Dynami c чрезвычайно сложно инструментировать, например eval (), но это верно для любого подхода.