Я написал небольшую утилиту покрытия кода для регистрации, какие основные блоки попадают в исполняемый файл x86. Он работает без исходного кода или отладки символов для цели, и просто берет потерянные базовые блоки, которые он контролирует.Как ускорить мой инструмент покрытия кода?
Однако, это становится узким местом в моем приложении, которое включает в себя повторные снимки покрытия одного исполняемого изображения.
Он прошел через несколько этапов, поскольку я пытался ускорить его. Я начал просто размещать INT3 в начале каждого базового блока, прикрепляя его как отладчик и регистрируя хиты. Затем я попытался повысить производительность за счет исправления в счетчике любого блока размером более 5 байт (размер JMP REL32). Я написал небольшую заглушку («mov [blah], 1/jmp backToTheBasicBlockWeCameFrom») в пространстве памяти процесса и исправил JMP. Это значительно ускоряет работу, поскольку нет исключения и нет отладки, но я хотел бы ускорить работу.
Я имею в виду одно из следующих действий:
1) Предварительно инструмент целевой бинарной с моими исправленных счетчики (на данный момент я делаю это во время выполнения). Я мог бы создать новый раздел в PE, бросить в него свои счетчики, заплатить все нужные мне крючки, а затем просто прочитать данные из того же раздела с моим отладчиком после каждого выполнения. Это даст мне некоторую скорость (около 16%, по моей оценке), но есть еще те досадные INT3, которые мне нужно иметь в меньших блоках, которые действительно будут калечить производительность.
2) Приведите двоичный код в свой собственный UnhandledExceptionFilter и обработайте его собственные int3 в сочетании с вышесказанным. Это означало бы, что нет процесса перехода от debuggee к моему инструменту покрытия на каждом int3, но все равно будет возникать исключение точки останова и последующий переход ядра. Правильно ли я думаю, что это не принесло бы мне большой производительности?
3) Попытайтесь сделать что-нибудь умное с помощью инструкций профилирования отраслевой аппаратуры Intel. Это звучит довольно устрашающе, но я не понимаю, как бы я это сделал - возможно ли это в приложении windows usermode? Я мог бы зайти так далеко, чтобы написать драйвер режима ядра, если он довольно прост, но я не кодер ядра (я немного пошатнулся) и, вероятно, вызвал бы у меня много головных болей. Существуют ли какие-либо другие проекты, использующие этот подход? Я вижу, что ядро Linux имеет контроль над самим ядром, что заставляет меня думать, что мониторинг конкретного приложения usermode будет затруднен.
4) Используйте готовое приложение. Он должен работать без каких-либо исходных или отладочных символов, быть сценарием (поэтому я могу запускаться партиями), и желательно быть свободным (я довольно скупой). Однако инструменты для оплаты не за горами (если я могу потратить меньше средств на инструмент и увеличить уровень производительности, чтобы избежать покупки нового оборудования, это было бы хорошим оправданием).
5) Что-то еще. Я работаю в VMWare в Windows XP, на довольно старом оборудовании (Pentium 4-ish) - есть ли что-то, что я пропустил, или какие-либо выводы, которые я должен прочитать? Могу ли я получить JMP REL32 до менее 5 байтов (и уловить меньшие блоки без необходимости в int3)?
Спасибо.
Голосовать против закрытия как «неконструктивный»? Меня поражает, как многие из них проголосовали за закрытие совершенно законных вопросов, с вполне разумными ответами. Вы, ребята, так плохо. –
Мне любопытно. Если вы делаете это без источника или символов, как вы изучаете результаты? Вы просто вычисляете процентное значение? Если процент низкий, как вы выясните, в каких разделах ваши тесты отсутствуют? –
Я на самом деле делаю чёрный ящик, чтобы найти дыры в безопасности. Идея состоит в том, что я немного мутирую входной файл, наблюдаю за любыми новыми блоками, которые открываются, а затем «спускаюсь», чтобы мутировать этот ввод больше, если он открывает блоки, которые мы не видели раньше.(Если у вас есть час или около того, чтобы сэкономить, я обнаружил, что презентация Трэвиса Орманди «делает программное обеспечение глупее» увлекательным - http://www.youtube.com/watch?v=YqZRuvdbR64) – randomdude