Реализация обработки Debug-событий

Coordinator
Mar 14, 2011 at 8:26 PM
Edited Mar 14, 2011 at 8:35 PM

В данном топике предполагается обсуждать реализацию обработки debug-событий в PYKD. В частности, интерфейсы для установки, обработки и снятия нотификаторов debug-событий.
В первую очередь предлагаю сделать обработчики событий:

Предположительно, реализация должна выглядеть так: глобальные функции SetCallbackOn(event, callback)/RemoveCallbackOn(event, callback). Где event - численный идентификатор обрабатываемого события, callback - экземпляр класса, у которого будет вызван соответствующий метод при срабатывании целевого события. В частности:

  • onBreak(dbgBreakPoint) - обработчик события возникновения точки останова, где dbgBreakPoint - PYKD-обертка над IDebugBreakpoint.
  • onException(dbgException) обработчик события возникновения исключения, где dbgException - экзепляр нового класса (который нужно написать), работающий с данными EXCEPTION_RECORD64 и bool-параметром FirstChance
  • onModuleLoad(dbgModule) - обработчик события загрузки модуля, где dbgModule экземпляр класса dbgModuleClass

Вопросы:

  • можно ли это (хранение указателя на объект питона и вызов по нему методов) реализовать из boost::python
  • будем ли сейчас как-то закладываться на то, что может быть несколько отладочных сесиий или в каждой сессии будут свои скрипты (соответственно - обработчики). Это актуально в виду того, что уже сейчас можно стартовать новый процесс под отладкой или открыть дамп падения.

 

Coordinator
Mar 15, 2011 at 10:20 AM
Edited Mar 15, 2011 at 10:20 AM

Сделать можно:
http://www.boost.org/doc/libs/1_45_0/libs/python/doc/v2/callbacks.html

Как я понял, выглядит это так:
Питон:

def calback( param1, param2):
    print  param1, param2

registerCallback( callback )

C++:

boost::python::object    g_callback;

void registerCallback( boost::python::object  callback )
{
    g_callback = callback;
}

void fireCallbackEvent()
{
      g_callback( 1, 2 );
}

Все с виду слишком даже просто.....

Если надо вызывать методы питоновского класса, будет немного посложней - но тоже вроде решаемо.

По поводу нескольких сессий:
Тут надо поэкспериментировать. Вроде когда случается событие, dbgeng сам переключит сессию. Для начала, этого будет достаточно.