如何解决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,但是 如果抛出其他异常,则继续运行。该命令可以是 有两种用法:
当您只想停止一个特定的CLR异常时
在调试器提示符下,加载SOS后随时输入:
!StopOnException-创建System.OutOfMemoryException 1
伪寄存器号(1)表示SOS可以使用寄存器 $ t1用于维护断点。 -create参数允许 SOS继续进行,并将断点设置为首选 例外。 -create2会将其设置为第二次例外。
当您需要更复杂的逻辑来停止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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。