Реализация расширения к 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, наверняка кто-то где-то такое уже делал. Вот бы глянуть одним глазком, как оно у них работает.
Вы уверены, что вам этом поможет? Даже обычный breakpoint с навешанным на него макросом, ИМХО, работает весьма не шустро. А вы хотите поставить по такому на каждую инструкцию. Боюсь, вы не дождетесь окончания сбора логов. Возможно, проще найти другой подход к проблеме?
PS как подписаться на получения e-mail при новых ответах?
> Вы уверены, что вам этом поможет? Даже обычный breakpoint с навешанным на него макросом, ИМХО, работает весьма не шустро.
Не уверен, поэтому рассматриваю другие варианты тоже. Например тут ребята из McAfee предлагают интересную альтернативу вообще без debug API и без trap flag. Называется оно у них umss. Но насколько я понял дальше proof of concept дело у них не пошло (а жаль!) По этой же ссылке кстати есть и некоторые бенчмарки скорости — чисто для сравнения.
> PS как подписаться на получения e-mail при новых ответах?
Это мой первый вопрос на Хабре, поэтому я не знаю. Мне и так на почту приходит, но это наверное потому что я автор вопроса.