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

时间:2015-02-03 18:38:00

标签: windbg ida

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

我正在使用IDA Pro 6.6和WinDbg。

3 个答案:

答案 0 :(得分:10)

一次对所有异常类型执行此操作有点尴尬

.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命令中。

答案 1 :(得分:4)

在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(访问冲突)。

帮助中的“控制例外和事件”部分说明 第一次机会和第二次机会的概念。

答案 2 :(得分:3)

您可以选择从WinDbg GUI“调试&gt;事件过滤器...”控制它,这将打开一个如下对话框:

enter image description here

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

因此,在您的情况下,您可以选择“忽略”和“未处理”,其中有一个MSDN页面,其中解释了更多内容:https://msdn.microsoft.com/en-us/library/windows/hardware/ff541752(v=vs.85).aspx