windbg StopOnException的“伪寄存器号”参数有什么作用?

问题描述

以下是windbg命令StopOnException(简称为soe)的帮助文本:

0:000> !soe
usage: StopOnException [-derived] [-create | -create2] <type name>
                       [<pseudo-register number for result>]
ex:    StopOnException -create System.OutOfMemoryException 1

参数“ 用于结果的伪寄存器号”的作用是什么?该示例使用值1,但没有任何后续操作。

我能找到的唯一其他documentation就是这样:

StopOnException [-derived] [-create | -create2] <Exception> <Pseudo-register number>  

使调试器在抛出指定的异常时停止, 但在引发其他异常时继续运行。

-derived选项捕获指定的异常,并且每个 从指定的异常派生的异常。

...在文本中完全没有提及此参数。该页面上的“伪”一词或具有相同含义的“注册”也没有任何其他用途。

解决方法

在windbg中还有其他帮助文本可以解释它。花了一段时间让我意识到这一点,也许对其他不熟悉windbg的人有用:

 0:000> !help stoponexception

产生:

 !StopOnException [-derived] 
                  [-create | -create2] 
                  <Exception> 
                  [<Pseudo-register number>]

!StopOnException在您希望Windows调试器停止运行时提供帮助 特定的托管异常,例如System.OutOfMemoryException,但是 如果抛出其他异常,则继续运行。该命令可以是 有两种用法:

  1. 当您只想停止一个特定的CLR异常时

    在调试器提示符下,加载SOS后随时输入:

    !StopOnException-创建System.OutOfMemoryException 1

    伪寄存器号(1)表示SOS可以使用寄存器 $ t1用于维护断点。 -create参数允许 SOS继续进行,并将断点设置为首选 例外。 -create2会将其设置为第二次例外。

  2. 当您需要更复杂的逻辑来停止CLR异常时

    !StopOnException可以纯粹用作更大的谓词 表达。如果您输入:

    !StopOnException System.OutOfMemoryException 3

    然后注册,如果最后一次抛出异常,则将$ t3设置为1 当前线程是System.OutOfMemoryException。除此以外, $ t3​​将设置为0。使用Windows调试器脚本 语言,您可以将此类呼叫链接在一起以停止各种 异常类型。您必须手动创建此类谓词, 例如:

    sxe -c“!soe System.OutOfMemoryException 3; !soe派生的System.IOException 4; .if(@ $ t3 == 1 || @ $ t4 == 1){.echo'stop'} .else {g}“

-derived选项将导致StopOnException设置 即使抛出的异常类型不完全,将伪注册设置为1 匹配给定的异常类型,但仅从中派生。所以, “派生的System.Exception”将捕获 System.Exception层次结构。

伪注册号是可选的。如果您不传递数字, SOS将使用伪注册 $ t1。

我突出显示了相关部分。

本质上,此选项使您可以指定应使用哪个伪寄存器来跟踪断点。也许在某些情况下,如果您不想覆盖现有的重要值,则指定自己的寄存器选择可以避免这种情况。

有关伪寄存器值的更多信息:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/pseudo-register-syntax