Как расставить бряки в дочерних процессах?

Jan 27, 2014 at 6:12 AM
Добрый день, столкнулся с такой проблемой:
для отладки офисных программ передавал в startProcess путь к exe-файлу и путь к офисному файлу, потом переопределял onModuleLoad в своем классе, унаследованном от eventHandler'а, расставляя в нем свои бряки. получается, что все работает в одном процессе, бряки срабатывают, и все хорошо.
но в InternetExplorer'е каждая вкладка открывается в новом процессе, и все мои бряки, расставленные при загрузке модулей в родительском процессе, оказываются не у дел, т.е. я могу отследить запуск новой копии InternetExplorer'а, предназначенной для открытия документа во вкладке, а что в ней происходит уже нет, ведь бряки в ней не установлены...

Есть ли возможность расставить бряки в создаваемых процессах?
Jan 27, 2014 at 7:34 AM
попробуйте в startProcess установить параметр debugChildren=TRUE.

При старте дочернего процесса при загрузке целевого модуля должен срабатать обработчик onModuleLoad еще раз и в нем можно будет поставить нужные брейкпойнты
Jan 27, 2014 at 12:52 PM
Edited Jan 27, 2014 at 12:56 PM
если передать debugChildren=TRUE, тогда видно, что бряки расставляются, но происходит смена execution status'a:
def onExecutionStatusChange(self, arg):
        if arg == 7:
            exceptionFunc('No Debuggee')
а дальше выскакивает ошибка:
Traceback (most recent call last):
  File "Analyzer.py", line 704, in <module>
    go()
__main__.WaitEventException: None of the targets could generate events
вызов функции go():
startProcess(strProc, debugChildren=True)
while True:
     go()
Jan 27, 2014 at 2:47 PM
Edited Jan 27, 2014 at 3:37 PM
А это когда просиходит?
Сразу после расстановки брейкпойнтов или при завершении отлаживаемого процесса?

Дело в том, что при завершении процесса получение статуса DebugStatusNoDebuggee ( 7 ) - это нормально.

Исключение, это тоже нормально

В следующей версии ( 0.3 ) сигнатура ф. go изменена - она возвращает текущий статус и ваш цикл выглядел бы так:
while go() != executionStatus.NoDebuggee:
     pass
В версии 0.2 при попытке сделать go() ( а этот вызов у вас в бесконечный цикл вставлен ) при отсутствии отлаживаемого процесса будет кудать указанное исключение ( WaitEventException )
Jan 28, 2014 at 6:55 AM
Порядок событий следующий:
  1. startProcess(path_to_ie + ' ' + url, debugChildren=True)
  2. в onModuleLoad расставляются бряки
  3. с помощью ntCreateUserProcess создается процесс-вкладка
  4. опять расставляются бряки (окно IE до сих пор не появилось)
  5. мигает окно IE
  6. сразу завершается работа скрипта с DebugStatusNoDebugee
Jan 28, 2014 at 9:41 AM
Попробуйте запустить скрипт с правами админа. При попытке просто в windbg отдебажить IE такой же эффект проявляется: процеес стратует и сразу идет на Terminate
Jan 30, 2014 at 12:19 PM
запускаю cmd от имени администратора, затем перехожу в папку со скриптом, запускаю скрипт - ничего не изменилось, все равно ИЕ вылетает.
система: Win7x86 + IE8
Jan 31, 2014 at 5:45 AM
Вот такой скрипт:
import pykd

pykd.startProcess(r"C:\Program Files (x86)\Internet Explorer\iexplore  http:\\ya.ru", debugChildren=True)

while True:
    pykd.go()
запускаю от админа:
скрипт работает ( пока IE не завершается )

запускаю от юзера:
сразу выходит с исключением:
Traceback (most recent call last):
  File "ie.py", line 8, in <module>
    print pykd.go()
__main__.WaitEventException: None of the targets could generate events
по поводу исключения - я уже писал, это следствие поптыки сделать go() для уже покойного процесса
Win7 x64 IE9
Feb 6, 2014 at 7:12 AM
решил проблему, убрав бряки с user32!MessageBoxExA и user32!MessageBoxExW, но странно то, что никаких ругательств на них при работе скрипта не было