try..except in interactive Windbg Python session 让我退出 Python session

try..except in interactive Windbg Python session throws me out of the Python session

我正在使用 PYKD 进行转储分析。 heap_stat 脚本中使用了 PYKD 库,我想以更具交互性的方式使用 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 子句中是有原因的,所以现在让我们尝试将此函数包装在 [=] 中交互式 Python 会话中的 18=] 子句:

Windbg prompt>!py
Input>try: ptrPtr(‭48806712‬) except: continue

=> 这给出了同样的错误,尽管有 try..except,我还是被抛出了 Python 会话。这很可能是由于错误的缩进,但另一方面,交互式 Windbg Python 会话不允许多行,所以我不能使用 Python 缩进。

有没有办法在 Windbg PYKD Python 会话中使用 try..except 子句?
提前致谢

P.s。为了您的理解:这种行为(被踢出交互式会话)似乎是 Windbg PYKD 的典型行为,正如您在以下命令提示符 Python 会话中看到的那样:

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 会话(观看 >>> 提示)。

您似乎使用了 copy/paste 并且您的输入字符串包含 unicode 符号并且 python 无法对其进行解码。尝试重新输入 'ptrPtr(‭48806712‬)'

interactive Windbg Python session does not allow multiline, so I can't use Python indentation.

你错了。您可以使用多行

>>> try:
...    1/0
... except:
...   print 0
... 
0
>>>