dimakovalenko
@dimakovalenko

Реализация расширения к WinDbg: tracer машинных команд?

Задача. Потребовалось мне написать расширение к WinDbg. Нужен tracer, который сможет выполнять одну машинную инструкцию x86-64 за другой между делом пописывая логи. Стандартные команды вроде p / pa / par / wt не подходят потому что нужна очень детальная кастомизация — что бы можно было указать «сюда не заходить, тут пролететь без остановок, сюда зайти только если RAX!=0, но логи не писать, тут писать краткие логи, а здесь в лог попадает всё включая содержимое таких-то адресов памяти...» Ну в общем понятно.

Проблема. Раньше никогда такого не писал, поэтому по ходу возникает много (возможно, глупых) технических вопросов. Например лучше каждый раз ставить breakpoint на следующую инструкцию с помощью IDebugControl::AddBreakpoint(...) перепоручая часть работы отладчику или через SetThreadContext(...) ставить trap flag и ловить EXCEPTION_SINGLE_STEP? И как быть с многопоточными приложениями? Нужно ли переключать потоки вручную или «оно как-то само»?

Собственно, вопрос. Может кто знает в сети подходящие примеры кода/open-source проекты в которых можно было бы подсмотреть реализацию такого (или хотя бы похожего) расширения? Я честно гуглил, и даже нашел какие-то крупицы информации, но чего-то цельного работающего (хотя бы proof-of-concept) на эту тему мне не попалось. Вряд ли мне первому понадобилась такая фича как трейсинг машинных инструкций в WinDbg, наверняка кто-то где-то такое уже делал. Вот бы глянуть одним глазком, как оно у них работает.


Заранее спасибо за ссылки.
  • Вопрос задан
  • 3183 просмотра
Пригласить эксперта
Ответы на вопрос 1
@EaS
Вы уверены, что вам этом поможет? Даже обычный breakpoint с навешанным на него макросом, ИМХО, работает весьма не шустро. А вы хотите поставить по такому на каждую инструкцию. Боюсь, вы не дождетесь окончания сбора логов. Возможно, проще найти другой подход к проблеме?

PS как подписаться на получения e-mail при новых ответах?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы