异常CLRDBG_NOTIFICATION_EXCEPTION_CODE( 0x04242420)的抛出过程

新建一个c#控制工程,就用自动生成的代码,不用补任何代码,如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
        }
    }
}

工程配置如下

编译,在windbg里加载运行

当调试器中断时,在事件过滤器里添加异常0x04242420方便抛出时跟踪

在命令行输入g命令让程序执行,然后中断

可以看到,抛出了异常0x04242420,调试器中断,输入.exr -1,观察下异常信息

0:000> .exr -1
ExceptionAddress: 762819b2 (KERNELBASE!RaiseException+0x00000062)
   ExceptionCode: 04242420
  ExceptionFlags: 00000000
NumberParameters: 3
   Parameter[0]: 31415927
   Parameter[1]: 721a0000
   Parameter[2]: 00b7f3b0

输入kv观察调用栈

0:000> kv
 # ChildEBP RetAddr  Args to Child              
00 00b7f330 72706c26 04242420 00000000 00000003 KERNELBASE!RaiseException+0x62 (FPO: [4,22,0])
01 00b7f3a4 7230aec4 00b7f3b0 00000c38 0000015c clr!Debugger::SendRawEvent+0x5d (FPO: [Non-Fpo])
02 00b7f7e0 72302a5b b1c50dba 00f140a0 723029d0 clr!Debugger::RaiseStartupNotification+0x36 (FPO: [0,268,0])
03 00b7f858 72302b3a b1c50d62 00ed6f38 72307ca0 clr!Debugger::Startup+0x76 (FPO: [Non-Fpo])
04 00b7f880 722f68db b1c50c3a 00000000 00000001 clr!InitializeDebugger+0x80 (FPO: [Non-Fpo])
05 00b7f9d8 722f58ca b1c50fc2 00000000 00000001 clr!EEStartupHelper+0x658 (FPO: [Non-Fpo])
06 00b7fa20 72316b9d b1c50f8a 00000000 00000000 clr!EEStartup+0x1e (FPO: [Non-Fpo])
07 00b7fa68 722c75ac b1c50f4a 00000000 723117c0 clr!EnsureEEStarted+0xd9 (FPO: [Non-Fpo])
08 00b7faa8 723117e5 b1c50f06 00000000 723117c0 clr!_CorExeMainInternal+0x8f (FPO: [Non-Fpo])
09 00b7fae4 7295fa84 5f72de49 729f43f0 7295fa20 clr!_CorExeMain+0x4d (FPO: [Non-Fpo])
0a 00b7fb1c 729ee80e 729f43f0 72950000 00b7fb44 mscoreei!_CorExeMain+0xd6 (FPO: [Non-Fpo])
0b 00b7fb2c 729f43f8 729f43f0 74c00419 0091e000 MSCOREE!ShellShim__CorExeMain+0x9e (FPO: [Non-Fpo])
0c 00b7fb34 74c00419 0091e000 74c00400 00b7fba0 MSCOREE!_CorExeMain_Exported+0x8 (FPO: [0,0,4])
0d 00b7fb44 76f2662d 0091e000 a984cad0 00000000 KERNEL32!BaseThreadInitThunk+0x19 (FPO: [Non-Fpo])
0e 00b7fba0 76f265fd ffffffff 76f451bb 00000000 ntdll!__RtlUserThreadStart+0x2f (FPO: [SEH])
0f 00b7fbb0 00000000 729f43f0 0091e000 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo])
这里就可以看到该异常的抛出过程了,.net执行引擎EE启动,初始化clr调试器(clr!InitializeDebugger),clr调试器启动(clr!Debugger::Startup),引发启动通知(clr!Debugger::RaiseStartupNotification),发送原始通知clr!Debugger::SendRawEvent,引发异常04242420(KERNELBASE!RaiseException)

输入uf clr!Debugger::SendRawEvent看下异常信息传递过程

0:000> uf clr!Debugger::SendRawEvent
clr!Debugger::SendRawEvent:
7230ae4e 6a40            push    40h
7230ae50 b8d6288672      mov     eax,offset clr! ?? ::FNODOBFM::`string‘+0x6f6c9 (728628d6)
7230ae55 e8ef49eaff      call    clr!_EH_prolog3_catch_GS (721af849)
7230ae5a 8b4d08          mov     ecx,dword ptr [ebp+8]//将最后一个附加参数调试器IPC事件指针放入ecx
7230ae5d c785e0ffffff27594131 mov dword ptr [ebp-20h],31415927h//局部变量保存第一个附加参数常量
7230ae67 a13c6e8e72      mov     eax,dword ptr [clr!g_pMSCorEE (728e6e3c)]
7230ae6c 8985e4ffffff    mov     dword ptr [ebp-1Ch],eax
7230ae72 898de8ffffff    mov     dword ptr [ebp-18h],ecx
7230ae78 ff15e0628f72    call    dword ptr [clr!_imp__IsDebuggerPresent (728f62e0)]
7230ae7e 85c0            test    eax,eax
7230ae80 0f855cbd3f00    jne     clr!Debugger::SendRawEvent+0x2b (72706be2)  Branch

clr!Debugger::SendRawEvent+0x7c:
7230ae86 e8f748eaff      call    clr!_EH_epilog3_catch_GS (721af782)
7230ae8b c20400          ret     4

clr!Debugger::SendRawEvent+0x2b:
72706be2 e80d80aaff      call    clr!GetThread (721aebf4)
72706be7 50              push    eax
72706be8 8d8dc4ffffff    lea     ecx,[ebp-3Ch]
72706bee e859b0aaff      call    clr!CLRException::HandlerState::HandlerState (721b1c4c)
72706bf3 83a5fcffffff00  and     dword ptr [ebp-4],0
72706bfa c685fcffffff01  mov     byte ptr [ebp-4],1
72706c01 8bc1            mov     eax,ecx
72706c03 8985dcffffff    mov     dword ptr [ebp-24h],eax//最后一个附加参数放到附加参数数组里
72706c09 c685fcffffff02  mov     byte ptr [ebp-4],2
72706c10 8d85e0ffffff    lea     eax,[ebp-20h]//取附件参数首地址放入eax
72706c16 50              push    eax//附件参数首地址入栈
72706c17 6a03            push    3//附件参数个数入栈
72706c19 6a00            push    0//异常标志入栈
72706c1b 6820242404      push    4242420h//异常代码入栈
72706c20 ff15e4628f72    call    dword ptr [clr!_imp__RaiseException (728f62e4)]//抛出异常
72706c26 c685fcffffff01  mov     byte ptr [ebp-4],1
72706c2d 8d8dc4ffffff    lea     ecx,[ebp-3Ch]
72706c33 e8edafaaff      call    clr!CLRException::HandlerState::CleanupTry (721b1c25)
72706c38 83a5fcffffff00  and     dword ptr [ebp-4],0
72706c3f 838dfcffffffff  or      dword ptr [ebp-4],0FFFFFFFFh
72706c46 f685c4ffffff02  test    byte ptr [ebp-3Ch],2
72706c4d 0f843342c0ff    je      clr!Debugger::SendRawEvent+0x7c (7230ae86)  Branch

原文地址:https://www.cnblogs.com/yilang/p/12063660.html

时间: 2024-07-31 21:04:56

异常CLRDBG_NOTIFICATION_EXCEPTION_CODE( 0x04242420)的抛出过程的相关文章

4.异常捕获后再次抛出

4.异常捕获后再次抛出 情况一:捕获后抛出原来的异常,希望保留最新的异常抛出点--fillStackTrace 情况二:捕获后抛出新的异常,希望抛出完整的异常链--initCause 1.捕获后重新抛出捕获的异常 在函数中捕获了异常,在catch模块中不做进一步的处理,而是向上一级进行传递 catch(Exception e){ throw e; } public class ReThrow { public static void f()throws Exception{ throw new

异常捕获处理与抛出

1 public int insert(String user_id,String u_name,String u_pwd,String u_phone,String u_address,String u_sex,String u_birthday) throws Exception{ 2 String sql="insert into user(user_id,u_name,u_pwd,u_phone,u_address,u_sex,u_birthday)" +"value

怎样自定义一个异常(报错) 并抛出

1. 自定义一个异常需要使用构造函数 Error() var error1 = new Error("This is an unknown error."); 2. 抛出异常需要使用 throw 关键字 var error1 = new Error("This is an unknown error."); throw error1; 执行后就可以得到这样的效果: 原文地址:https://www.cnblogs.com/aisowe/p/11655006.html

Java中抛出的各种异常

目录(?)[-] 引子 JAVA异常 处理异常机制 捕获异常trycatch 和 finally try-catch语句 trycatch-finally语句 try-catch-finally 规则异常处理语句的语法规则 trycatchfinally语句块的执行顺序 抛出异常 throws抛出异常 使用throw抛出异常 Throwable类中的常用方法 Java常见异常 runtimeException子类 IOException 其他 自定义异常 1. 引子 try…catch…fina

PLSQL_Oracle Exception异常分类、异常抛出、异常处理、异常传播(概念)

2014-06-03 BaoXinjian 一.摘要 在PLSQL程序开发过程中,很重要的部分就是对程序异常的监控和处理,包括如何触发异常,何时进行处理,如何进行处理,是否将程式中的所有异常集中在一起,通过公共异常处理的procedure或function,如果没有完善的程式处理机制,很难说该程式是一只健壮的程式,当程式遇到很多类型或者量很多资料时,系统若没有异常处理必然会导致程式的出错 当预判到了某些异常,需要对预判到的异常进行合适相应的处理,是否抛出异常还是忽略还是其他 当然程式没有预判到或

一个问题:关于finally中return吞掉catch块中抛出的异常

今天遇到一个感觉很神奇的问题,记录一下问题以及自己分析问题的思路. 预警:不知道怎么看java字节码的朋友可能需要先看一下如何阅读java字节码才能看懂后面的解释. 我有一段程序: public class Test { public static void main(String[] args) { try { int a = 1 / 0; } catch (Exception e) { throw e; } } } 这个程序的运行结果相信大家都能猜到: 在main方法里捕获异常没有处理直接往

Java throw:异常的抛出怎么回事

到目前为止,你只是获取了被Java运行时系统抛出的异常.然而,程序可以用throw语句抛出明确的异常.Throw语句的通常形式如下:    throw ThrowableInstance;这里,ThrowableInstance一定是Throwable类类型或Throwable子类类型的一个对象.简单类型,例如int或char,以及非Throwable类,例如String或Object,不能用作异常.有两种可以获得Throwable对象的方法:在catch子句中使用参数或者用new操作符创建.

Think in Java 笔记_Chapter12_1_Exception基础_异常处理3_自定义异常以及抛出多个异常的处理

自定义异常 package cn.seven.shengsiyuan.exception; public class MyException extends Exception{//非运行时异常,因为只是继承了Exception并非RuntimeException public MyException() { // TODO Auto-generated constructor stub } public MyException(String message){ super(message);/

第六十一条:抛出与抽象相对应的异常

想想这样一种情况:方法B抛出了一个受检的异常 ,那么方法A在内部调用方法B时,面对方法B抛出的受检异常,可以选择继续抛出向上传播这个异常, 也可以捕获这个异常进行处理.究竟是向上传播抛出,还是捕获处理呢??? 有一个指导原则是:抛出与抽象想对应的异常. 例如如果方法B抛出了NoSuchElementException这个受检异常,然而在方法A中调用方法B时,根据方法A中的逻辑,当遇到NoSuchElementException 异常时,抛出一个IndexsOutOfBoundsException