【问题标题】:What does the "pseudo-register number" argument to windbg StopOnException do?windbg StopOnException 的“伪寄存器号”参数有什么作用?
【发布时间】:2020-10-30 22:54:10
【问题描述】:

这里是windbg 命令StopOnException(简称soe)的帮助文本:

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

参数“pseudo-register number for result”是干什么用的?该示例使用值1,但没有任何后续。

我能找到的唯一另一个documentation 是这样说的:

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

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

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

...文中根本没有提到这个论点。该页面上也没有任何其他使用“伪”一词,或具有相同含义的“注册”。

【问题讨论】:

    标签: windbg


    【解决方案1】:

    windbg 中有额外的帮助文本可以解释它。我花了一段时间才意识到这一点,也许它对windbg的新手有用:

     0:000> !help stoponexception
    

    产生:

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

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

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

      在调试器提示符处,加载 SOS 后的任何时间,键入:

      !StopOnException -create System.OutOfMemoryException 1

      伪寄存器号(1)表示SOS可以使用寄存器 $t1 用于维护断点。 -create 参数允许 SOS 继续设置断点作为第一次机会 例外。 -create2 会将其设置为第二次机会异常。

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

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

      !StopOnException System.OutOfMemoryException 3

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

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

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

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

    我突出显示了相关部分。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 2012-06-15
      • 1970-01-01
      • 2015-11-20
      • 1970-01-01
      相关资源
      最近更新 更多