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

WinDBG-如何设置所有要传递到应用程序的异常?,windbg,ida,Windbg,Ida,如何将所有异常行为设置为传递给应用程序而不显示在调试器中 我正在使用IDA Pro 6.6和WinDbg。在WinDbg中,sx系列命令用于控制 应处理例外情况 要将异常直接传递给应用程序,请使用禁用特定异常的sxd命令。 (实际禁用平均忽略第一次机会异常) 据我所知,您必须在所有特殊情况下使用sxd, 因为sxd*表示所有未以其他方式显式命名的异常 使用sx命令查看可用的异常和当前设置。并在所有要禁用的对象上使用sxd 0:000> sx ct - Create thread -

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


我正在使用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
0:000>sx
ct-创建线程-忽略
et-退出线程-忽略
cpr-创建流程-忽略
av-访问冲突-中断-未处理
0:000>sxd av
0:000>sx
ct-创建线程-忽略
et-退出线程-忽略
av-访问冲突-第二次机会中断-未处理
我认为输出有点难以解释;调试器现在不会以任何可见的方式处理av(访问冲突)

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

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

.foreach(exc {sx}) {.catch{sxd ${exc}}}
它的作用是:

  • {sx}
    :列出所有异常类型(以及您实际上不想要的当前设置)
  • exc
    :分配一个变量
  • .foreach(…){…}
    :将其切成若干个单字,然后执行命令
  • sxd${exc}
    :禁用变量exc中的任何内容
  • .catch{…}
    :忽略来自设置信息的所有错误消息
上述方法的优点是它与WinDbg版本无关。如果引入新的异常代码,它仍然可以工作

使用可避免处理不需要的文本。将以下脚本保存到文件
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“调试>事件过滤器…”控制此操作,这将打开如下对话框:

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


因此,在您的情况下,您可以在MSDN页面中选择“忽略”和“未处理”,该页面对此进行了更多解释:

是否可以仅删除异常名称,以避免将其他垃圾传递到sxd命令?@hypersw:不幸的是,不可以。由于输出的长度是不可预测的,因此不能使用/pS和/pS选项used@hypersw:您当然可以手动列出所有异常。我已经编辑了答案