异常相关数据结构

当一个异常发生时,操作系统要向引起异常的线程的栈里压入三个结构,这三个结构是:E X C E P T I O N _ R E C O R D结构、C O N T E X T结构和E X C E P T I O N _ P O I N T E R S结构。

一、E X C E P T I O N _ R E C O R D

这个结构包含有关最近发生的异常的详细信息,这些信息独立于C P U,定义如下:

typedefstruct_EXCEPTION_RECORD

{

DWORD ExceptionCode;

DWORD ExceptionFlags;

struct_EXCEPTION_RECORD *ExceptionRecord;

PVOID ExceptionAddress;

DWORD NumberParameters;

ULONG_PTR ExceptionInformation[EXCEPTION_MAXIMUM_PARAMETERS];

} EXCEPTION_RECORD;

ExceptionCode:包含异常的代码。这同内部函数G e t E x c e p t i o nCo d e()返回的信息是一样的。这是一个硬件异常产生的代码或者由RaiseException函数指定产生的软件异常码。

ExceptionFlags:包含有关异常的标志。当前只有两个值,分别是0(指出一个可以继续的异常)和E X C E P T I O N _ N O N C O N T I N U A B L E(指出一个不可继续的异常)。在一个不可继续的异常之后,若要继续执行,会引发一个E X C E P T I O N _ N O N C O N T I N U A B L E _E X C E P T I O N异常。

ExceptionRecord:指向另一个未处理异常的E X C E P T I O N _ R E C O R D结构。在处理一个异常的时候,有可能引发另外一个异常。例如,异常过滤器中的代码就可能用零来除一个数。当嵌套异常发生时,可将异常记录链接起来,以提供另外的信息。如果在处理一个异常过滤器的过程当中又产生一个异常,就发生了嵌套异常。如果没有未处理异常,这个成员就包含一个N U L L。

ExceptionAddress:指出产生异常的C P U指令的地址

NumberParameters: 规定了与异常相联系的参数数量(0 到1 5 )。这是在E x c e p t i o n I n f o r m a t i o n数组中定义的元素数量。对几乎所有的异常来说,这个值都是零。

ExceptionInformation: 规定一个附加参数的数组,用来描述异常。对大多数异常来说,数组元素是未定义的。RaiseException函数可以指定这个参数数组。下面的表格展示了哪些异常码的数组元素是定义了的。

Exception code Meaning
EXCEPTION_ACCESS_VIOLATION

The first element of the array contains a read-write flag that indicates the type of operation that caused the access violation. 数组的第一个元素包含了一个读写标志,表示引起访问违规的操作类型。If this value is zero, the thread attempted to read the inaccessible data. 如果这个值为0,表示线程试图读取不可访问的数据。If this value is 1, the thread attempted to write to an inaccessible address. 如果这个值为1,表示线程试图写入不可访问的地址。If this value is 8, the thread causes a user-mode data execution prevention (DEP) violation.如果这个值是8,表示线程线程引发了一个用户模式的DEP违规。

The second array element specifies the virtual address of the inaccessible data.数组的第二个元素指定了不可访问数据的虚拟地址。

EXCEPTION_IN_PAGE_ERROR

The first element of the array contains a read-write flag that indicates the type of operation that caused the access violation. 数组的第一个元素包含了一个读写标志,用于表示引起访问违规的操作类型。If this value is zero, the thread attempted to read the inaccessible data. 如果值为0,表示线程试图读取不可访问的数据。If this value is 1, the thread attempted to write to an inaccessible address. 如果值为1,表示线程试图写入不可访问的地址。If this value is 8, the thread causes a user-mode data execution prevention (DEP) violation.如果值为8,表示线程引起了一个用户模式的DEP违规。

The second array element specifies the virtual address of the inaccessible data.数组的第二个元素指定了不可访问数据的虚拟地址。

The third array element specifies the underlying NTSTATUS code that resulted in the exception.数组的第三个元素表示底层的NTSTATUS码引起的本次异常。

二、C O N T E X T

包含处理器特定的寄存器数据。系统使用上下文结构执行各种内部操作。

typedef struct _WOW64_CONTEXT {
  DWORD                    ContextFlags;
  DWORD                    Dr0;
  DWORD                    Dr1;
  DWORD                    Dr2;
  DWORD                    Dr3;
  DWORD                    Dr6;
  DWORD                    Dr7;
  WOW64_FLOATING_SAVE_AREA FloatSave;
  DWORD                    SegGs;
  DWORD                    SegFs;
  DWORD                    SegEs;
  DWORD                    SegDs;
  DWORD                    Edi;
  DWORD                    Esi;
  DWORD                    Ebx;
  DWORD                    Edx;
  DWORD                    Ecx;
  DWORD                    Eax;
  DWORD                    Ebp;
  DWORD                    Eip;
  DWORD                    SegCs;
  DWORD                    EFlags;
  DWORD                    Esp;
  DWORD                    SegSs;
  BYTE                     ExtendedRegisters[WOW64_MAXIMUM_SUPPORTED_EXTENSION];
} CONTEXT;

三、E X C E P T I O N _ P O I N T E R S

这个结构只有两个数据成员,二者都是指针,分别指向被压入栈的E X C E P T I O N _ R E C O R D和C O N T E X T结构:

typedefstruct _EXCEPTION_POINTERS

{

PEXCEPTION_RECORDExceptionRecord;

PCONTEXTContextRecord;

} EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;

当我们在调试程序异常时可以利用这些数据结构的数据来分析定位问题代码。

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

时间: 2024-11-09 01:02:43

异常相关数据结构的相关文章

异常相关问题

1.Java中的两种异常是什么?它们之间的区别? Java有两种类型的异常:checked与unchecked(检查与未检查) 异常. 如果unchecked异常可能会在方法或构造函数的执行时被抛出从而蔓延到方法或构造函数的外部, 它们也不需要要在方法或构造函数中声明throws子句. 然而, checked异常必须通过方法或构造函数的throws子句声明. 关于java异常处理的建议请参考这里Java exception handling. 2.Java中异常与错误的区别? Exception

Python3 与 C# 面向对象之~异常相关

周末多码文,昨天晚上一篇,今天再来一篇: 在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master 在线预览:http://github.lesschina.com/python/base/oop/3.异常相关.html 代码裤子:https://github.com/lotapp/BaseCode/tree/master/python/2.OOP/4.Exception 1.异常¶ 1.1 try...except¶ 又到了开新课的时候了,小

C++异常相关

使用异常处理,程序中独立开发的各部分能够就程序执行期间出现的问题相互通信,并处理这些问题.C++ 的异常处理中,需要由问题检测部分抛出一个对象给处理代码,通过这个对象的类型和内容,两个部分能够就出现了什么错误进行通信. 一:概述 1:在C++中的异常处理语句包括: try:try语句块以try关键字开始,并且以一个或者多个catch子句结束.try语句块中执行正常的代码,并且可以抛出异常,在try块后面catch子句捕获异常,并处理之. throw表达式:用来抛出异常. try块的通用语法形式是

【机器学习】NumPy、Panda相关数据结构学习

NumPy学习 NumPy重要的一个特点:是一个N维数组对象.提供了shape(指明行数.列数)和dtype(数据类型) 初始化 1 data1 = [3,5] 2 3 arr1 = np.array(data1) 4 arr1 5 输出:array([3, 5]) 注意,如果有切片来自于该数据,改变切片,也会改变原来的数据. Panda 主要由Series和DataFrame组成. Series 1,Series包括了index和values,其中values数据包括各种NumPy数据类型.与

linux uart驱动——相关数据结构以及API(二)

一.核心数据结构      串口驱动有3个核心数据结构,它们都定义在<#include linux/serial_core.h>1.uart_driver     uart_driver包含了串口设备名.串口驱动名.主次设备号.串口控制台(可选)等信息,还封装了tty_driver(底层串口驱动无需关心tty_driver). 1: struct uart_driver { 2: struct module *owner; /* 拥有该uart_driver的模块,一般为THIS_MODULE

java实验六(继承、接口、异常相关知识点)

定义一个学生类,定义一个大学生类和小学生类,这两个类是学生类的子类:定义一个选课接口,由大学生类实现该接口,并定义一个年龄异常处理,当小学生 年龄小于7岁时,弹出异常. import java.util.Scanner; interface XuanKe        //选课接口{    void xuanKe(String xuanke);} class AgeException extends Exception{    String message; AgeException(int a

【linux驱动笔记】字符设备驱动相关数据结构与算法

欢迎转载,转载时需保留作者信息,谢谢. 邮箱:[email protected] 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:http://blog.csdn.net/xiayulewa   1.1.1.   设备号 alloc_chrdev_region(&dev, 0, 1, "buttons") /  register_chrdev_region: 动态申请设备号, 设备号组成了链表节点. 最后的结果为:所有的ch

Linux物理内存相关数据结构

节点:pg_data_t typedef struct pglist_data { zone_t node_zones[MAX_NR_ZONES]; zonelist_t node_zonelists[NR_GFPINDEX]; struct page *node_mem_map; unsigned long *valid_addr_bitmap; struct bootmem_data *bdata; unsigned long node_start_paddr; unsigned long

C++ 相关数据结构

LinkList VS. List // Questions and Answers://// Q. Should I use std::list or base::LinkedList?//// A. The main reason to use base::LinkedList over std::list is// performance. If you don't care about the performance differences// then use an STL conta