WinDBG - 如何将所有异常设置为传递到应用程序中?

WinDBG - how to set all exception to be passed into app?

如何将所有异常行为设置为传递给应用程序而不出现在调试器中?

我正在使用 IDA Pro 6.6 和 WinDbg。

在 Windbg 中,sx 系列命令用于控制如何 应该处理异常。

要将异常直接传递给应用程序,请使用禁用特定异常的 sxd 命令。 (实际上禁用意味着忽略第一次机会异常) 据我所知,您必须对所有特定异常使用 sxd, 因为 sxd * 表示所有未明确命名的异常。

使用 sx 命令查看可用的异常和当前设置。并在所有要禁用的对象上使用 sxd。

 0:000> sx
   ct - Create thread - ignore
   et - Exit thread - ignore
  cpr - Create process - ignore
 <cut> 
   av - Access violation - break - not handled

 0:000> sxd av
 0:000> sx
 ct - Create thread - ignore
 et - Exit thread - ignore
 <cut> 
 av - Access violation - second-chance break - not handled

我认为输出有点难以解释; av(访问冲突)现在不会被调试器以任何可见的方式处理。

帮助中的“控制异常和事件”部分解释了 第一次机会和第二次机会的概念。

同时对所有异常类型执行此操作有点尴尬

.foreach(exc {sx}) {.catch{sxd ${exc}}}

它的作用:

  • {sx}: 列出所有异常类型(和当前设置,你实际上不需要)
  • exc: 赋值一个变量
  • .foreach(...) {...}: 将其切割成单个单词的碎片并执行命令
  • sxd ${exc}: 禁用变量 exc
  • 中的任何内容
  • .catch{...}:忽略所有来自设置信息的错误信息

上述方法的优点是它与 WinDbg 版本无关。如果引入新的异常代码,它仍然有效。

可以使用 PyKd 避免处理不需要的文本。将以下脚本保存到文件 sdx.py 和 运行 !py sxd.py:

from pykd import *

sx = dbgCommand("sx")
for s in sx.splitlines():
    ex = s[:4]
    if  not ex=="" or ex.isspace():
        print("sxd "+ex)
        dbgCommand("sxd "+ex)

另一个选项是手动处理所有异常:

.foreach(exc {.echo "ct et cpr epr ld ud ser ibp iml out av asrt aph bpe bpec eh clr clrn cce cc dm dbce gp ii ip dz iov ch hc lsq isc 3c svh sse ssec sbo sov vs vcpp wkd rto rtt wob wos *"}) {.catch{sxd ${exc}}}

但是,如果WinDbg中有新的异常代码,则必须将它们添加到.echo命令中。

您可以选择从 WinDbg GUI 控制它'Debug>Event Filters...'这将打开一个对话框,如下所示:

在这里您可以设置 WinDbg 如何处理每种异常类型以及它们是否应该被启用、禁用、输出到 WinDbg 控制台输出或被忽略,然后在事件触发时 WinDbg 或您的应用程序是否应该处理它。

所以在你的情况下你可以 select 'Ignore' 和 'Not Handled' 有一个 MSDN 页面解释了更多:https://msdn.microsoft.com/en-us/library/windows/hardware/ff541752(v=vs.85).aspx