将SEH异常映射到NET异常
Win32 SEH异常也可以作为.NET异常捕获。在下面的代码中,托管函数(main)调用本机函数(f),该函数抛出SEH exception exception_INT_DIVIDE_BY_ZERO。大体上,这个异常是在处理System::ExceptionA类型异常的catch块中捕获的。
//ExceptionHandling2.cpp//compile with "cl /clr ExceptionHandling2.cpp"//As I will discuss later, #pargma managed is not recommended; it is only//used to show exceptions thrown across managed / unmanaged boundaries//without using two source files #pragma unmanaged int f() { #pragma managed int main() { catch(System::ExceptionA ex) {
System::Console::WriteLine(ex->GetType()->FullName);
关于STATUS_NO_MEMORY(0xC0000017)异常
简介
STATUS_NO_MEMORY,值为0xC0000017。代表的意思是"没有足够的虚拟内存或分页文件配额来完成指定的操作。"。它定义在 ntstatus.h头文件里,如下:
/
// MessageId: STATUS_NO_MEMORY
//
// MessageText:
//
// {Not Enough Quota}
// Not enough virtual memory or paging file quota is available to complete the specified operation.
//
#define STATUS_NO_MEMORY ((NTSTATUS)0xC0000017L) // winnt
异常结构填充
ExceptionAddress: 7706a44c (ntdll!RtlpAllocateHeapRaiseException+0x0000003b)
ExceptionCode: c0000017
ExceptionFlags: 00000000
NumberParameters: 1
Parameter[0]: 00000010//这个值暂时没整明白代表的意思,望知道的同仁告知
windbg分析句柄泄漏常用命令和步骤
分析命令
1、!htrace -enble。
2、执行重现过程,让进程句柄泄漏
3、通过!htrace -diff 找出有问题的栈。
关于STATUS_STOWED_EXCEPTION(0xC000027B)异常
简介
STATUS_STOWED_EXCEPTION,值为0xC000027B。代表的意思是"发生应用程序内部异常"。它定义在 ntstatus.h头文件里,如下:
/
// MessageId: STATUS_STOWED_EXCEPTION
//
// MessageText:
//
// An application-internal exception has occurred.
//
#define STATUS_STOWED_EXCEPTION ((NTSTATUS)0xC000027BL)
详细说明
本异常是UWP应用程序产生的异常类型。它是作为WinRT API(现在称为UWP)的一部分引入Windows 8.0的。这个异常已被故障点异常(0xC000027C)替换/增强。与POF异常一样,异常代码由WinRT框架生成。它不需要重新编译应用程序才能使用它。
当异步操作失败时,将引发这个异常。当通过RoOriginateException或RoOriginateLanguageException调用从工作线程报告异常时,将通过CaptureStackBackTrace函数调用收集当前线程的堆栈回溯(指令指针数组)。异常的堆栈回溯和HRESULT包装在一个iresteredrorinfo对象中,并通过WinRT的语言投影层路由到调用方。
如果调用方未处理异常,则会致命地抛出已装载的异常。因为抛出是延迟的,所以关联转储的当前上下文几乎没有值。原始问题的线程不再定期存在,如果存在,则已结束操作(意味着线程的堆栈内存已被覆盖)。这意味着函数参数和局部变量不可用。
异常结构信息填充
ExceptionAddress:
ExceptionCode: c000027b
ExceptionFlags: 00000001
NumberParameters: 2
Parameter[0]: 000002414ffc8680//是指向以STOWED_EXCEPTION_INFORMATION_HEADER开头的结构的指针数组的起始地址。自Windows 8.1以来,已使用的版本是STOWED_EXCEPTION_INFORMATION_V2。
Parameter[1]: 000000000000003//是数组中指针的数目。
WinDbg里查找线程栈的StackBase 和 StackLimit 的硬偏移
User Mode 32bit
0:000> dt nt!_TEB.Stack*
ntdll!_TEB
+0x000 NtTib :
+0x004 StackBase : Ptr Void
+0x008 StackLimit : Ptr Void
User Mode 64bit
0:000> dt nt!_TEB NtTib.Stack*
ntdll!_TEB
+0x000 NtTib :
+0x008 StackBase : Ptr64 Void
+0x010 StackLimit : Ptr64 Void
Kernel Mode 32bit
0:000> dt nt!_KTHREAD Stack*
ntdll!_KTHREAD
+0x01c StackLimit : Ptr Void (NT v5.0 - Windows 2000)
+0x01c StackLimit : Ptr Void (NT v5.1 - Windows XP SP3)
+0x01c StackLimit : Ptr Void (NT v5.2 - Windows 2003 SP2)
+0x02c StackLimit : Ptr Void (NT v6.0 - Windows Vista/2008)
+0x02c StackLimit : Ptr Void (NT v6.1 - Windows 7/2008R2)
+0x15c StackBase : Ptr Void (NT v5.0 - Windows 2000)
+0x15c StackBase : Ptr Void (NT v5.1 - Windows XP SP3)
+0x158 StackBase : Ptr Void (NT v5.2 - Windows 2003 SP2)
+0x174 StackBase : Ptr Void (NT v6.0 - Windows Vista/2008)
+0x194 StackBase : Ptr Void (NT v6.1 - Windows 7/2008R2)
Kernel Mode 64bit
0:000> dt nt!_KTHREAD Stack*
ntdll!_KTHREAD
+0x??? StackLimit : Ptr64 Void(NT v5.1 - Windows XP SP3)
+0x??? StackLimit : Ptr64 Void(NT v5.2 - Windows 2003 SP2)
+0x030 StackLimit : Ptr64 Void(NT v6.0 - Windows Vista/2008)
+0x030 StackLimit : Ptr64 Void(NT v6.1 - Windows 7/2008R2)
+0x??? StackBase : Ptr64 Void(NT v5.1 - Windows XP SP3)
+0x??? StackBase : Ptr64 Void(NT v5.2 - Windows 2003 SP2)
+0x250 StackBase : Ptr64 Void(NT v6.0 - Windows Vista/2008)
+0x278 StackBase : Ptr64 Void(NT v6.1 - Windows 7/2008R2)