четверг, 26 мая 2011 г.

Обработка событий загрузки и выгрузки модулей отлаживаемой системы

Одно из нововведений релиза pykd 0.0.18 это базовый класс для обработки событий от Debug Engine. В текущей версии реализованы только события загрузки и выгрузки модулей. Об этом было рассказано в обзоре релиза.
Реализация сделана через базовый класс debugEvent, реализация которого расположена в модуле pykd. Для обработки соответствующего события необходимо написать свой класс, в котором переопределить методы onLoadModule(...) или onUnloadModule(...), в зависимости от того, какие события необходимо обрабатывать. Входным параметром для этих методов выступает экземпляр класса загруженного модуля dbgModuleClass.
В качестве демонстрации этого функционала рассмотрим часть скрипта samples\goLoad.py:
from pykd import *

import fnmatch
import sys

class loadHandler(debugEvent):
def __init__(self, mask):
debugEvent.__init__(self)
self.mask = mask
  def onLoadModule(self, module):

if fnmatch.fnmatch( module.name(), self.mask ):
return DEBUG_STATUS_BREAK
return DEBUG_STATUS_NO_CHANGE

if __name__ == "__main__":
if len(sys.argv) == 2:
loadHandler = loadHandler( sys.argv[1] )
go()

Фактически, скрипт продолжает исполнение целевой системы, пока не будет загружен модуль, имя которого будет совпадать с указанной маской (передается первым параметром в скрипт). Передаваемая маска имени модуля может содержать wildcard'ы: символы * и ?. То есть, например, что бы при старте системы дождаться загрузки модуля beep.sys в память, нужно выполнять команду: "!py goLoad *beep*". Это может быть полезно, когда нужно, что бы отладчик остановился перед вызовом точки входа целевого модуля, но уже при загруженном целевом модуле. В этот момент можно расставлять точки останова в загруженном модуле или, например, дождаться исполнения точки входа в драйвер командой "g beep!DriverEntry"

P.S. Сейчас в планах развивать функционал фильтрации отладочных событий. Хотелось бы услышать мнение конечных пользователей о том, какие событий представляют наибольший интерес (соответственно, реализация этих событий будет более приоритетной задачи). В число событий, для которых в pykd планируется реализовать механизмы фильтрации, входят:
  • Создание и уничтожение процесса
  • Возникновение исключения
  • Создание и уничтожение нити (thread)
  • Изменение состояния отлаживаемой сесии
  • Срабатывание точки останова. pykd уже предоставляет класс bp. Но планируется так же продублировать функционал в debugEvent, что бы была возможность написать единый диспетчер событий Debug Engine.

4 комментария:

  1. Весьма полезно!
    Насколько я понял это аналог sxe ld?

    ОтветитьУдалить
  2. > Насколько я понял это аналог sxe ld?

    Именно так, это отладочные исключения ld и ud

    ОтветитьУдалить
  3. Во время срабатывания точки останова (ставить через bp(addr,handler) ) - отладчик пишет
    "Breakpoint 1 hint". Как убрать эту надпись?

    ОтветитьУдалить
  4. > отладчик пишет "Breakpoint 1 hint". Как убрать эту надпись?
    К сожалению - никак.
    В принципе можно экспортировать в питон класс, который будет перехватывать _весь_ вывод, сохраняя его внутри себя как коллекцию строк для дальнейшей обработки. Но сейчас такой функционал не реализован

    ОтветитьУдалить