【问题标题】:WinDBG - how to set all exception to be passed into app?WinDBG - 如何设置所有异常传递到应用程序?
【发布时间】:2015-02-03 18:37:59
【问题描述】:

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

我正在使用 IDA Pro 6.6 和 WinDbg。

【问题讨论】:

    标签: windbg ida


    【解决方案1】:

    一次对所有异常类型都这样做有点尴尬

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

    【讨论】:

    • 是否可以只删除异常名称,以避免将其他垃圾传递给 sxd 命令?
    • @hypersw:很遗憾没有。由于输出的长度不可预测,因此无法使用 /pS 和 /ps 选项
    • @hypersw:您当然可以手动列出所有例外情况。我已经编辑了答案
    【解决方案2】:

    在 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(访问冲突)现在不会由调试器以任何可见的方式处理。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-02-23
        • 2012-04-28
        • 2016-08-07
        • 1970-01-01
        • 1970-01-01
        • 2011-03-19
        • 1970-01-01
        • 2017-03-12
        • 2010-09-15
        相关资源
        最近更新 更多