Я работаю с PYKD, делаю анализ дампа. Библиотека PYKD используется в сценарии heap_stat, и я хотел бы использовать библиотеку PYKD более интерактивным способом, например:
Windbg prompt>!py
Input>dbgCommand("x /2 *!CStringArray*vftable*")
Это работает нормально (я знаю, что это бесполезно, я просто хочу показать, что это работает).
Однако скрипт heap_stat содержит следующий фрагмент исходного кода:
try:
vftable_candidate = ptrPtr(ptr) # which pointer value is present on that spot in memory?
dprintln("DDS vftable_candidate [%08x], ptr value [%d], ptr pointer [%08x]" % (vftable_candidate, ptr, ptr))
except:
continue
Когда я пытаюсь сделать это интерактивно, кажется, что это не работает:
Windbg prompt>!py
Input>ptrPtr(48806712)
Это приводит к следующей ошибке, которая выбрасывает меня из сеанса Python:
File "<console>", line 1
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python27\Lib\code.py", line 243, in interact
more = self.push(line)
File "C:\Python27\Lib\code.py", line 265, in push
more = self.runsource(source, self.filename)
File "C:\Python27\Lib\code.py", line 79, in runsource
self.showsyntaxerror(filename)
File "C:\Python27\Lib\code.py", line 139, in showsyntaxerror
map(self.write, list)
File "C:\Python27\Lib\code.py", line 171, in write
sys.stderr.write(data)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 11: ordinal not in range(128)
Это нормально : есть причина для обертывания этого вызова функции внутри предложения try..except
, поэтому давайте теперь попробуем обернуть эту функцию внутри предложения try..except
в интерактивном сеансе Python:
Windbg prompt>!py
Input>try: ptrPtr(48806712) except: continue
=> Это дает ту же ошибку, я снова выбрасываюсь из сеанса Python, несмотря на try..except
. Скорее всего, это связано с неправильным отступом, но, с другой стороны, интерактивный сеанс Windbg Python не допускает многострочный, поэтому я не могу использовать отступ Python.
Есть ли способ использовать try..except
предложения в сеансе Python Windbg PYKD?
Заранее спасибо
P.s. для вашего понимания: это поведение (исключаемое из интерактивного сеанса) кажется типичным для Windbg PYKD, как вы можете видеть в следующей командной строке Python session:
Windows Prompt>python
Python 2.7.10 (default, May 23 2015, 09:40:32) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print 1/0
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: integer division or modulo by zero
>>>
Как видите, исключение выдается, но я не выхожу из сеанса Python (смотрите подсказку >>>
).