Windows异常分发 - First Chance Exception vs Second Chance Exception

windows x64异常分发流程 0x00 对windows比较熟悉的同学应该都知道SEH这个概念,我们可以通过SEH来来捕获异常,之后决定怎么处理。 具体的内容可以查看:https://bbs.pediy.com/thread-173853.htm 在上面的文章中,少讲了VCH。 我们根据异常的分发流程,在没有挂上调试器的情况下,异常会先被路由到veh,之后进入seh。那么就存在一个很严重的问题,seh是针对特定线程的特定函数的... 阅读详情

通过visualstudio运行程序,经常会在output里面看到类似的输出,

A first chanceexception of type 'System.DivideByZeroException' occurred in xxx.dll


我们的问题

  • 什么是first chance exception?
  • 什么是second chance exception?
  • 他们对开发人员的意义是什么? 

异常分发处理的机制

理解windows异常分发机制主要要看明白这张图(摘自Windows Internal Chapter 3),


异常分发的流程如下

1.所有的异常都会根据系统的idt(interrupt dispatch table)分发到陷阱处理器(trap handler),系统的idt可以通过内核调试命令!idt查看。

2. Trap handler将异常信息交给内核中的异常分发器,异常分发器先查看是否存调试器与之相关联,如果存在则将控制权交给调试器,这就是第一次异常发生(first chance exception)这样做使得我们在异常发生之初,自定义异常处理之前得到控制权可以查看异常的原始信息。

3.如果没有相关联的调试器或者调试器未对该异常进行处理,分发器开始基于栈查找异常处理器。

4.如果没有找到异常处理器或者异常处理器为对其进行处理,分发器再次尝试分发给调试器端口,第二次异常发生(second chance exception)。

5.如果没有调试器或者调试器没有处理第二次异常,分发器将该异常发送给环境子系统的异常端口用来转换成各种不同的环境子系统相应的错误提示代码。

6.如果环境子系统对异常为进行处理,分发器分发给内核默认异常处理器。该异常处理器是在线程启动的时候注册的。可以通过system internal提供的process explore察看线程的启动地址。

 

线程的启动代码大致如下

VOID RtlUserThreadStart(VOID){

    LPVOID lpStartAddr = (R/E)AX; // Located in the initial thread context structure
    LPVOID lpvThreadParm = (R/E)BX; // Located in the initial thread context structure
    LPVOID lpWin32StartAddr;

    lpWin32StartAddr = Kernel32ThreadInitThunkFunction ? Kernel32ThreadInitThunkFunction :
lpStartAddr;
    __try {

        DWORD dwThreadExitCode = lpWin32StartAddr(lpvThreadParm);
        RtlExitUserThread(dwThreadExitCode);

    } __except(RtlUnhandledExceptionFilter(
            GetExceptionInformation())) {

        RtlExitUserProcess(GetExceptionCode());
    }
}
void Win32StartOfProcess(
    LPTHREAD_START_ROUTINE lpStartAddr,
    LPVOID lpvThreadParm){

    lpStartAddr(lpvThreadParm);
}

该异常处理逻辑会根据以下注册表项进行相应的处理,例如我机器上的注册表项配置为visualstudio debug,异常发生的时候vs会启动让用户来决定是否要attach到进程查看异常。

HKLM\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug

 

 

 

 

 

信号完整性分析学习--16--传输线效应 传输线效应 说到传输线效应,大多数人都会想到一个经验法则,那就是: “当互连线的长度大于1/6倍的信号上升时间的空间延伸时,互连线就体现出传输线效应。” 上升时间越小越容易体现传输线效应。 由此可见,同一根互连线,它是否体现传输线效应,要看它要传输什么样的信号。下图所示,一根延时为15ps的互连线,当它传输上升时间为60ps的信号时就会体现传输线效应;当它传输上升时间为180ps的信号时就不体现传输线效应。 阅读详情

相关推荐

从零实现Unitree Go2的SLAM建图与导航:手把手集成slam_toolbox和nav2(附Rviz2可视化配置)

本文详细指导如何在Unitree Go2四足机器人上集成slam_toolbox和nav2,实现SLAM建图与导航功能。从ROS2环境配置、雷达数据处理到slam_toolbox参数优化,再到nav2路径规划与Rviz2可视化调试,提供完整解决方案。特别适合机器人开发者快速掌握ROS2导航栈在Unitree Go2上的应用实践。

weixin_33737134的博客 1229

异常处理之不要放过First-chance exception

不要放过First-chance exception1)什么是First-chance exception VC6调试环境下(debug)运行程序时,经常在output窗口看到有 First-chance exception in hotfoxd.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception. 的输出字样。 当调试程序时,若引发

铭星的专栏 2万+

SAP成本中心费用分割(KSS2)实战:从原理到月末调整全解析

本文详细解析了SAP成本中心费用分割(KSS2)的核心逻辑与实战操作,从成本要素分组配置到月末调整全流程。通过KSS2将初级成本要素按作业类型重新分类为次级成本要素,确保成本结算准确。文章还提供了常见错误处理方法和典型业务场景实战,帮助用户高效完成SAP成本结算。

weixin_29279101的博客 1254

FirstChanceException原理

异常处理是代码中很重要的一项注意点。但是有时候一些不恰当的异常处理,反而会影响我们在代码运行时的调试。 出现问题 假如我们有这么一段代码,我期望调用Bar方法,输出“黄腾霄是帅哥”。 但是在实际运行中,其中的一个方法Foo抛出了一个异常。 而作为代码书写者,为了确保软件的正常运行,将这个方法的所有异常都吞掉了。 此时导致的结果就是,用户端看到软件运行正常,但是没有期望的输出 static v...

黄腾霄的博客 812

【Agent】多智能体框架MetaGPT入门教程

创建一个 Action 类的子类 SimpleWriteCode,子类中定义好 prompt,并解析返回结果。在 MetaGPT 中,

酒酿小圆子呀~ 3133

Windows Server 搭建ftp服务

Windows Server 搭建ftp服务

ch258563的博客 1010

First Chance Exception是什么东东?

译注:我们可以配置VS2005从而不显示First Chance异常信息。具体操作见下: 在output窗口右击,在弹出的菜单中不勾选Exception messages选项,这样在output窗口就看不到First Chance异常信息了。 --------------------------------------------------------------- First C

那些成长的日子 868

Codex入门01-环境安装(小白入门:手把手教你安装配置,国内网络也能搞定)

本文手把手教你从零搭建 Codex CLI 开发环境。内容涵盖 Node.js 安装(macOS/Windows/Linux)、Codex CLI 全局安装、ChatGPT 账号登录认证,以及国内网络代理配置。还包括常见问题排查和一键启动脚本编写。跟着截图一步步操作,10分钟搞定全部环境,开始用AI写代码!

yueyeguzhuo的专栏 343

程序崩溃分析实战:从dump文件生成到WinDbg/GDB深度调试

在软件开发和运维中,程序崩溃是常见的棘手问题。理解程序崩溃的根本原因,需要掌握核心的调试分析技术。程序在崩溃或异常时生成的内存转储文件(dump文件),记录了进程状态的完整快照,是分析问题的关键证据。其原理在于保存了崩溃瞬间的调用堆栈、变量值、线程状态等内存信息,为离线分析提供了可能。这项技术的核心价值在于能够分析难以复现的线上崩溃、死锁和高负载问题,无需依赖现场日志。在应用场景上,它广泛应用于后端服务、桌面应用和移动端的故障排查。通过配置系统自动生成dump、使用Procdump/gcore等工具主动抓取

weixin_30443075的博客 391

Proxmox(pve)集群(4)存储(1)配置分布式存储ceph

它使用一种称为CRUSH(Controlled Replication Under Scalable Hashing)算法的数据分布算法来将数据均匀地分布在多个存储节点上,并确保数据的冗余和容错。它负责管理数据的分布、冗余和自动修复。PVE支持本地存储、LVM、NFS、iSCSI、CephFS、RBD、ZFS等存储方式,我这里使用两种存储方式,一种是通过ceph实现分布式存储,一种是通过truenas实现集中式存储。自我管理和自动恢复:Ceph具有自我管理的特性,可以动态地调整和优化存储集群的配置。

Monster✺◟(∗❛ัᴗ❛ั∗)◞✺的博客 2623

拉曼光谱入门:10.显微拉曼与共聚焦技术

本文系统阐述了显微拉曼光谱技术与共聚焦原理的融合机制,详细解析了从激光激发、针孔空间滤波到光谱采集的完整光路架构,阐明了共聚焦设计在提升三维空间分辨率、抑制荧光背景及实现微区无损层析方面的核心优势,并探讨了关键光学器件的性能边界与系统技术局限。

qq_53529450的博客 164

理解First Chance和Second Chance避免单步调试

在现在C++、Java、.Net代码大行其道的时候,很多代码错误(Bug)都是通过异常的形式表现出来的。由于工期紧或者种种原因,很多程序员在碰到程序发生未处理的异常的第一反应就是try … catch (Exception e) { … }。然而代码开发到后期的时候,这种简单粗暴的解决代码错误(Bug)的方式就会在其他不相干的地方表现出来,有的时候甚至导致程序随机的不稳定,而且很难调试。比如执行下

zeusuperman1的专栏 1242

示波器核心参数选型指南:带宽、采样率与嵌入式调试实战

示波器是电子工程师进行信号观测与故障诊断的基础仪器,其性能由带宽、采样率、通道数、存储深度、触发系统和探头特性共同决定。带宽定义高频响应边界,需遵循5倍法则以保障数字信号上升沿测量精度;采样率则依据奈奎斯特定理并结合工程冗余(通常≥2.5×带宽)实现可靠时域重建。二者协同影响信号完整性评估能力,尤其在UART、I²C、SPI等嵌入式总线调试中至关重要。高存储深度支持长时捕获与毛刺定位,智能触发与硬件协议解码进一步将波形分析升维至语义级。本文围绕真实嵌入式场景,解析参数间的耦合关系与典型误用陷阱。

weixin_42588877的博客 91

VC调试程序输出First-chance Exception.

    在VC中调试程序时,Output窗口有时会出现“First-chance exception in xxx.exe...”这样的信息。一般来说,这是由于程序中发生了异常,被VC捕获而产生的输出。    在调试器中运行程序时,如果程序产生异常,调试器会首先获得通知(即First-chance exception),而后此异常由产生它的程序负责捕获。如果程序没有捕获此异常,那么调试器会再次

沙漠黑鸟的专栏 4767

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

应⽤程序调⽤ RaiseException函数时触发异常处理机制的两个阶段

在 Windows 中, 当⼀个应⽤程序调⽤ RaiseException 函数时,会触发异常处理机制。 这个机制包括两个主要阶段:第⼀次机会异常处理(First-Chance Exception Handling)和第⼆次机会异常处理(Second-Chance Exception Handling)。

捕鲸叉的专栏 575

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

First Chance Exception

<br />转载自罗朝辉的优快云博客 出处:http://blog.youkuaiyun.com/kesalin/archive/2009/03/19/4004522.aspx<br /> <br />First Chance Exception是什么东东? <br />译注:我们可以配置VS2005从而不显示First Chance异常信息。具体操作见下:<br />在output窗口右击,在弹出的菜单中不勾选Exception messages选项,这样在output窗口就看不到First Chance异常信息了

ayw_hehe的专栏 650

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

调试内存损坏:到底谁将“ 2”写入我的堆栈?

嗨,我叫Tautvydas,我是Windows团队的Unity软件开发人员。 我想分享一个调试难以捉摸的内存损坏错误的故事。 (Hi, my name is Tautvydas and I’m a software developer at Unity working in the Windows team. I’d like to share a story of debugging an e...

culiao6493的博客 906

SEH 入门

SEH 机制 Structedexception handling 结构化异常处理的简称。 这里介绍的异常处理并不是我们通常看到的__try__catch 语句,而是操作系统提供的一种异常机制。通过这种称为SHE 的机制,用户可以通过定义注册自己的异常处理函数以在异常出现的时候有机会执行自己的代码,决定程序流程。我们平时直观看到的异常处理机制都是编译器建立在windows SHE 基础之上的一

商少 875

Windows 8的用户模式Shim Engine小探及利用

转载:https://bbs.pediy.com/thread-175483.htmWindows Shim Engine,即Windows 兼容性模式实现引擎,在exe文件的属性对话框中有一个兼容性选项卡,用户可设置此exe程序完美工作的系统版本,Windows会尝试模拟老的系统环境运行此程序。那Windows是如何模拟的呢?Windows认为老程序出问题的原因在于它们调用的API上,...

dengliang7440的博客 1163

vs2010:First-chance exception

First-chance exception表明程序运行出现了access violation异常,但被你或者你使用的某个模块中的异常处理程序捕捉到了。调试器用这种办法来通知你出现了一个异常。在调试状态下,打开debug菜单下的exception对话框,把access violation异常的action改成stop always,这时再出现异常,调试器就会弹出一个对话框报告这个异常,并在异常发生

GreenArrowMan-优快云博客 2000
上一篇: Http 400错误重现实验及解决办法
下一篇: 追踪ASP.NET请求性能瓶颈
WebDebug
博客等级 码龄14年 17粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值