首页 > 其他分享 >Windbg的First chance exception

Windbg的First chance exception

时间:2024-05-14 12:09:41浏览次数:23  
标签:exception Windbg 中断 chance 设置 first 异常 调试器

什么是 First chance exception

在 Windows 调试环境中,“first chance exception”是一个非常重要的概念,它涉及到异常处理机制的早期阶段。理解这一概念对于开发和调试程序尤为关键。以下是对 "first chance exception" 的详细解释:

异常处理的两个阶段

  1. First Chance Exception: 当程序中抛出一个异常时,操作系统首先给予调试器一个处理异常的机会。这称为“first chance”(第一次机会)。在这一阶段,调试器可以选择捕获并处理这个异常,也可以什么都不做并允许程序的异常处理逻辑继续执行。

  2. Second Chance Exception: 如果异常在第一阶段没有被调试器处理(即没有被捕获或者调试器允许它继续传递),那么程序的异常处理器(如果有的话)将接手尝试处理该异常。如果程序没有处理这个异常或者没有相应的异常处理器,异常会再次返回给调试器,这时称为“second chance”(第二次机会)。在大多数情况下,如果异常到了这个阶段仍未处理,程序将会崩溃。

为什么区分这两个阶段?

  • 调试目的:对调试者来说,了解何时以及在程序的哪个部分抛出异常非常重要。通过捕获 first chance exception,调试者可以在异常处理逻辑被执行之前查看程序的状态,这有助于识别和修复问题。
  • 程序流控制:在一些情况下,程序员故意在代码中使用异常来控制程序流。例如,在.NET中,一些系统异常可能被应用逻辑捕获并妥善处理,而不需要程序崩溃。

实际应用

在实际的开发和调试过程中,大多数现代IDE和调试器(如 Visual Studio, WinDbg)都会显示 first chance exception 的消息,以提示开发者异常发生的时刻和上下文。开发者可以配置调试器来决定是否在 first chance exceptions 上中断,或者仅在未处理的异常(即 second chance exceptions)上中断。

理解 first chance 和 second chance exceptions 对于深入分析和优化程序的错误处理机制至关重要,特别是在复杂的应用程序中,合理处理这些异常可以极大提升程序的稳定性和用户体验。

捕获first chance exception

在 WinDbg 中设置自动中断以捕捉到 first chance exceptions 是一个常用的调试策略,尤其是在处理难以追踪的错误时。以下是如何配置 WinDbg 以便在遇到 first chance exceptions 时自动中断的步骤:

1. 打开 WinDbg 并连接到程序

首先,启动 WinDbg 并附加到你要调试的进程,或者开启一个新的调试会话。

2. 使用 sxe 命令

在 WinDbg 的命令行中,你可以使用 sxe(Set Exception)命令来设置对特定异常的中断。sxe 命令使调试器在第一次遇到指定的异常时自动中断。例如,若要在任何 CLR 异常上中断,可以使用如下命令:

sxe clr

这条命令设置调试器在遇到任何 CLR 异常时中断。

3. 针对特定异常设置中断

如果你知道特定的异常代码,比如 e0434352(常见于 .NET 异常),你可以指定这个异常:

sxe e0434352

4. 使用 sx 命令查看和修改设置

你可以用 sx 命令来查看当前所有异常的处理状态。这个命令会列出所有已知异常和你的自定义设置,显示它们是被设置为忽略还是中断。若需要修改这些设置,你可以使用 sxi (Set Exception Ignore) 来忽略某个异常,或者再次使用 sxe 来更改设置。

sx

5. 保存调试设置

如果你希望每次使用 WinDbg 时都自动应用这些设置,可以将它们保存到你的调试器初始化文件(例如 win.ini)。这样每次启动 WinDbg 时,都会自动加载这些设置。

实用示例

为了更全面地捕捉到所有 CLR 异常,包括非常规的和常规的 .NET 异常,可以使用如下设置:

sxe clr
sxe e0434352

使用这些设置,你的调试器会在 CLR 第一次抛出异常时中断,这使得你可以立即查看引发异常的上下文,无需等待程序崩溃或其他更严重的错误发生。

总之,通过 sxe 命令在 WinDbg 中设置对 first chance exceptions 的自动中断是一个强大的功能,它可以帮助开发者及时捕获和处理潜在的错误。

取消First chance exception 中断

在 WinDbg 中,如果你想取消之前使用 sxe (Set Exception) 命令设置的异常处理规则,可以使用 sxi (Set Exception Ignore) 命令。这会设置调试器在遇到指定的异常时不自动中断,而是忽略它,允许程序的正常异常处理机制接管处理。

使用 sxi 命令

要取消对特定异常的自动中断设置,你可以使用 sxi 命令后跟异常的缩写或代码。例如,如果你之前设置了对所有 CLR 异常 (clr) 的自动中断,可以使用以下命令来取消这一设置:

sxi clr

如果你想取消对特定异常代码(如 .NET 异常 e0434352)的中断设置,可以使用:

sxi e0434352

恢复默认异常处理

如果你想恢复所有异常到默认处理状态(即通常忽略 first chance 异常,只在 second chance 异常时中断),可以使用 sxd (Set Exception Default) 命令:

sxd *

这个命令会将所有异常配置恢复到默认状态,通常意味着调试器会忽略 first chance 异常而只在 second chance 异常时中断。

检查当前的异常处理设置

使用 sx 命令可以列出当前所有的异常处理设置,这可以帮助你验证哪些异常被设置为自动中断、忽略或者有其他特殊的处理规则:

sx

这将显示所有已配置的异常以及它们的处理状态。

实用提示

  • 当调整异常处理设置时,考虑到这可能会影响调试过程中程序的行为。适当地使用这些命令可以帮助你更有效地定位和分析问题。
  • 在团队协作或者当你从事复杂的调试任务时,保持异常处理设置的文档记录是一个好习惯,这可以帮助同事或将来的你理解为什么某些设置是必要的。

以上就是如何在 WinDbg 中取消对异常的自动中断设置的详细说明,希望对你的调试工作有所帮助。

标签:exception,Windbg,中断,chance,设置,first,异常,调试器
From: https://www.cnblogs.com/ddeef/p/18191041

相关文章

  • java.lang.IllegalArgumentException: Invalid value type for attribute 'factoryBea
    简介前排提示:这个错误一般是由于Spring新版本导致的与其他框架不兼容现象,解决办法一般是升级其他框架版本。使用springboot-3.2.5和myabtis-plus-3.5.0搭建开发环境时,启动Springboot程序时报错,报错信息:点击查看代码java.lang.IllegalArgumentException:Invalidvalu......
  • C# 使用QuestPDF各种报错,System.IO.FileNotFoundException:“未能加载文件或程序集,Dll
    最近要做一个生成pdf报告的小功能,搜索一番之后,选择了QuestPDF这个库由于我是要在netframework4.8中实现功能,可能使用场景太老了,导致使用过程一波三折,非常的坎坷,折腾了一下午,增长了一些经验,记录下来1,如果你要在netframework4.8框架中使用,就不要自作聪明的用netstandard2.0框架......
  • 基于PG开发数据库中出现PSQLException: 错误,无法确定参数$1的数据类型
    问题描述在开发接口适配瀚高数据库时,出现此错误:同样的xml文件在达梦、金仓、Mysql中使用模糊查询时未发现错误;...likeconcat('%',#{name},'%')后经排查与数据库连接中:jdbc:highgo://.../test?stringtype=unspecified存在联系。加入``是为了避免ERROR:columnisofty......
  • 解决HtmlUnit执行JS报错提示ScriptException
    问题描述HtmlUnit作为一款比Selenium更轻量的HeadLess的Java版本浏览器模拟器,不需要在服务器上安装部署浏览器及其Driver程序。但是,众所周知,HtmlUnit对JS脚本的支持并不是很有话,GitHub中大部分的issue都和JS执行错误有关。笔者在实际使用(HtmlUnit4.1.0版本)过程中也遇到了JS执......
  • org.apache.catalina.LifecycleException: Protocol handler start failed
    出现问题org.apache.catalina.LifecycleException:Protocolhandlerstartfailed,是因为端口号被占用1、按键盘上windows+R,输入CMD(不区分大小写)2、输入netstat-ano回车,查看所有进程(注意”-“前面有空格)3、输入netstat-ano|findstr"端口号"(注意”-“前面有空格)4、输入ta......
  • python-设计异常处理类Cexception,并基于异常处理类设计并实现日期类Date
    【题目描述】定义一个异常类Cexception解决日期类实现中的自定义异常处理。设计的日期类应包含以下内容:① 有三个成员数据:年、月、日;② 有设置日期的成员函数;③ 有用格式"月/日/年"输出日期的成员函数;④ 要求在日期设置及有参构造函数中添加异常处理。【源代码程序......
  • 解决远程调用三方接口:javax.net.ssl.SSLHandshakeException:sun.security.validator.Va
    一、前言最近在对接腾讯会议API接口,在鉴权完成后开始调用对方的接口,在此过程中出现调用报错:javax.net.ssl.SSLHandshakeException。二、出现原因当你在进行https请求时,JDK中不存在三方服务的信任证书,导致出现错误javax.net.ssl.SSLHandshakeException:sun.security.validator.Va......
  • 关于FreeSql报错System.Exception: SQL logic error near " ": syntax error
    ps:不要什么都存数据库。。。遇到一个BUG,调试了好久没找到原因,后来打印了sql语句,问题出在msg.Msg字段的保存,如下:msg.Msg是一串JSON字符串保存的时候,FreeSql会解析成:因为特殊字符,导致保存失败。 ......
  • java exception and finally return
    exceptioncategorythrowableallbelongstothrowableerrorStackOverFlowOutOfMemoryruntimeexceptionArrayIndexOutOfBoundsExceptionNullPointerExceptioncheckecexception(needtocatchorthrows)catch最好设置一个兜底的匹配原则匹配的原则是:如果抛出的异......
  • 构造题选讲 by_chance
    不知道会不会有方法论,先咕了。upd:有的捏,但是好像没啥用/qdARC145DNonArithmeticProgressionSet首先考虑如何构造\(n\)个数满足不存在\(2y=x+z\)。考虑一个分治:将值域均匀分成三部分,并且让所有数平分在第一部分和第三部分,直至为\(1\)就可以在值域内选一个位置扔进去。......