新建一个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],h//局部变量保存第一个附加参数常量
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

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

  1. JAVA异常的捕获与抛出原则

    在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...

  2. 【开发技术】java异常的捕获与抛出原则

    在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...

  3. C# 异常 抛异常的时候 同时抛出 传入的参数

    abp的审计日志都把这些功能实现了 可以借鉴 抛异常的时候 同时抛出 传入的参数 大致这样实现,aop,方法执行先,先把参数写入到栈中,抛异常时,栈中自然就有此时的参数了. 可用于重现该异常. 获取把 ...

  4. 《Java基础——异常的捕获与抛出》

    Java基础--异常的捕获与抛出     '  前言: Error类(错误)和Exception类(异常)是Throwable类的子类. 异常分为CheckedException类(编译时异常)和Ru ...

  5. 异常0xc000041d的抛出过程

    为了说明这个过程,我们必须写一个示例程序,如下: #include "stdafx.h" #include <tchar.h> #include <stdio.h ...

  6. [转贴] 从零开始学C++之异常(二):程序错误、异常(语法、抛出、捕获、传播)、栈展开

    一.程序错误 编译错误,即语法错误.程序就无法被生成运行代码. 运行时错误 不可预料的逻辑错误 可以预料的运行异常 例如: 动态分配空间时可能不会成功 打开文件可能会失败 除法运算时分母可能为0 整数 ...

  7. 异常CLRDBG_NOTIFICATION_EXCEPTION_CODE( 0x04242420)

    简介 CLRDBG_NOTIFICATION_EXCEPTION_CODE,值为0x0x04242420.此异常在.CLR 4.0的启动路径期间触发,是CLR4.0版本初始化调试服务时向调试器发送消息 ...

  8. C++ EH Exception(0xe06d7363)----抛出过程

    C++ EH Exception是Windows系统VC++里对c++语言的throw的分类和定义,它的代码就是0xe06d7363.在VC++里其本质也是SEH结构化异常机制.在我们分析用户崩溃的例 ...

  9. Java中,异常的处理及抛出

    首先我们需要知道什么是异常? 常通常指,你的代码可能在编译时没有错误,可是运行时会出现异常.比如常见的空指针异常.也可能是程序可能出现无法预料的异常,比如你要从一个文件读信息,可这个文件不存在,程序无 ...

随机推荐

  1. (十四)golang--函数和包

    1.怎么定义函数? func (形参列表) 返回值列表{ 执行操作 return } 2.什么是包? 包的本质就是一个文件夹,存放程序文件 三大作用: 区分相同的名字的函数.变量等标识符: 当程序文件 ...

  2. Beta冲刺(8/7)——2019.5.30

    作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Beta冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 队 ...

  3. SpringCloud与Dubbo区别对比

    1:SpringCloud与Dubbo区别对比 (1):活跃度 目前SpringCloud的活跃度明显远高于Dubbo(参考github) (2):主要区别   Dubbo Spring Cloud ...

  4. 解决SpringBoot无法读取js/css静态资源的新方法

    前言 作为依赖使用的SpringBoot工程很容易出现自身静态资源被主工程忽略的情况.但是作为依赖而存在的Controller方法却不会失效,我们知道,Spring MVC对于静态资源的处理也不外乎是 ...

  5. C# 分解文件路径目录

    利用正则表达式分解文件目录 [^\\].*?[\\$]|[^\\].*?\.\w+|\w+ 测试字符串:C:\Users\wppcn\Desktop\中文长字符第一次测试\新建文件夹1\新建文件夹2\ ...

  6. Web应急:管理员账号被篡改

    你是某一个网站的管理员,有一天,你的管理员账号admin却登录不了,进入数据库查看,原来管理员账号用户名不存在了,却多了另外一个管理员用户名.不对,不是新增了管理员,而是你的管理员用户名被篡改了. 现 ...

  7. 阿里OSS前端直传

    第一次写博客,如有错误请多多指教. 先上代码吧: ossUpload = function (file, fun, funParameter) { //第一此请求后台服务器获取认证请求 $.ajax( ...

  8. Sqlserver表值函数来获取逗号分隔的ID

    其功能为: 将字符串如'1,2,3,4,5,6' 拼接成SQL里面的id 1:使用: select * from Student where id IN( SELECT * FROM dbo.F_SP ...

  9. Mark: 实现个toy版的脚手架(RPC)

    p.s.  这些小toy的规模都在几百~上千行代码量,但足以反映一个tool的核心思想. 包括: 一些中间件(消息队列.Netty) Spring的IoC容器:(自动依赖注入) —— 就是利用Java ...

  10. 被严重误会?APS系统没有想象的那么复杂

    APS的出现要从90年代了,但到现在,很多行业内的顾问或用户提到APS都马上想到的是“要求很精确”“难度很大”“脱离实际”“太理想化”“工作量太大”等等,然后把它束之高阁不睬. 在这里,给大家分析一下 ...