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

AnA*_*ons 8 windbg ida

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

我正在使用IDA Pro 6.6和WinDbg.

Tho*_*ler 11

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

.foreach(exc {sx}) {.catch{sxd ${exc}}}
Run Code Online (Sandbox Code Playgroud)

它能做什么:

  • {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)
Run Code Online (Sandbox Code Playgroud)

另一种选择是手动处理所有异常:

.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}}}
Run Code Online (Sandbox Code Playgroud)

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


Kje*_*nar 6

在 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
Run Code Online (Sandbox Code Playgroud)

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

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


EdC*_*ica 5

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

在此处输入图片说明

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

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