代码改变世界

Windbg的First chance exception

2024-05-14 11:59 by 山不转水转..., 阅读(249) 阅读, 推荐(0) 推荐, 收藏, 编辑

什么是 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 中取消对异常的自动中断设置的详细说明,希望对你的调试工作有所帮助。

WPF 文本框焦点导致的内存泄露问题

2021-08-11 21:53 by 山不转水转..., 阅读(62) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:如果窗口关闭的时候文本框具有焦点,可能会造成窗口对象无法被GC。 参考链接: - https://social.msdn.microsoft.com/Forums/exchange/en-US/63beb527-7cb4-4491-923a-c9516905d451/memory-leak-due- 阅读全文

产品功能被像素级抄袭了。我们拿什么来保护原创的产品设计?

2021-05-01 22:05 by 山不转水转..., 阅读(1649) 阅读, 推荐(10) 推荐, 收藏, 编辑
摘要:产品功能被像素级抄袭了。我们拿什么来保护原创的产品设计? 阅读全文

显示器文字发虚的一种原因

2020-12-13 08:01 by 山不转水转..., 阅读(653) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:现象: 文字发虚,有彩色毛边。 结论: 显卡的输出格式设置不正确。 显示正常的显示器设置为: 不正常的,输出格式为YCbCr444。 阅读全文

HttpClient + IIS压缩动态内容

2020-08-11 21:33 by 山不转水转..., 阅读(174) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:IIS 设置 HttpClient设置 var handler = new HttpClientHandler { UseProxy = useProxy }; if (handler.SupportsAutomaticDecompression) { handler.AutomaticDecomp 阅读全文

Windows 上第一款全局轮盘菜单软件(鼠标党进)

2019-12-23 16:29 by 山不转水转..., 阅读(1660) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:Quicker 是一个 Windows 上的全面的效率工具,主要可以提升鼠标、键盘的操作效率。 通过为常用操作建立捷径,减少无用功。还可以用组合动作通过搭积木的方式实现一定程度的自动化。 嗯,有免费版,欢迎使用。 阅读全文

C# Async Await 注意事项

2016-10-07 16:18 by 山不转水转..., 阅读(1388) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:Avoid Using Async Void 避免使用async void async void 只能用于事件处理函数。并且保证永远不在用户代码中调用这些事件处理函数。 async void 调用时,不能使用await,所以程序执行不会停止在调用处,而是马上执行下面的语句,可能会引起意外的情况发生。 阅读全文

MVC6的内置ActionResult类型

2015-12-20 11:25 by 山不转水转..., 阅读(956) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:BadRequestObjectResult,BadRequestResulthttp 400 bad requestChallengeResultContentResultCreatedAtActionResult CreatedAtRouteResult CreatedResult EmptyR... 阅读全文

将long数字序列化为json时,转换为字符串

2015-02-20 16:44 by 山不转水转..., 阅读(3134) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:由于javascript中所有数字都是64位的浮点数,所以整数只能精确的表示53bit长的数字。在从server得到的json数据中,有ID是长整数类型,在客户端根据此ID生成的link也是不准确的。办法1是后端ViewModel中ID都改为string类型,但是这种方式会需要在后台进行大量的转换,... 阅读全文

共享一个在线代码片段收集服务

2014-05-02 17:00 by 山不转水转..., 阅读(541) 阅读, 推荐(0) 推荐, 收藏, 编辑
摘要:目的:用于个人收集代码片段或者网页片段。使用前需注册或使用Google帐号登录。主界面:创建代码段:创建文章片段:查看代码片段:网址在这里:http://codebag.urtracker.cn欢迎有需的同学来使用。 阅读全文
点击右上角即可分享
微信分享提示