_purecall函数
默认纯虚拟函数调用错误处理程序。 当调用纯虚拟成员函数时,编译器生成调用此函数的代码。
原型:
extern "C" int __cdecl _purecall();
将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);
RaiseFailFastException函数
引发绕过所有异常处理程序(基于帧或矢量)的异常。引发此异常将终止应用程序并调用Windows错误报告(如果Windows错误报告正在运行)。
原型:
VOID WINAPI RaiseFailFastException( __in_opt PEXCEPTION_RECORD pExceptionRecord, __in_opt PCONTEXT pContextRecord, __in DWORD dwFlags );
Visual Studio调试器指南---多线程应用程序调试(三)
在本机代码中设置线程名称
在 Visual Studio 的任何版本中都可以使用线程命名功能。 当调试正在运行的进程时,线程命名有助于标识 "线程" 窗口中感兴趣的线程。 在通过故障转储检查并使用各种工具分析性能捕获时,具有 recognizably 命名的线程也会有所帮助。
设置线程名称的方法
可以通过两种方法来设置线程名称。 第一种方式是通过SetThreadDescription函数。 第二种方法是在 Visual Studio 调试器附加到进程时引发特定异常。 每种方法都有优点和注意事项。 从 Windows 10 版本1607或 Windows Server 2016 开始,支持使用 SetThreadDescription
。
值得注意的是,_这两_种方法可以一起使用(如果需要),因为它们的工作机制彼此独立。
使用 SetThreadDescription
设置线程名称
优点:
- 在 Visual Studio 中进行调试时,线程名称是可见的,无论调试程序是否已在调用 SetThreadDescription 时附加到进程。
- 在 Visual Studio 中加载故障转储后,线程名称将在执行事后调试时可见。
- 使用其他工具(如WinDbg调试器和Windows 性能分析器性能分析器)时,也会显示线程名称。
注意:
- 线程名称只在 Visual Studio 2017 版本15.6 及更高版本中可见。
- 当事后调试故障转储文件时,只有在 Windows 10 版本1607、Windows Server 2016 或更高版本的 Windows 上创建了崩溃后,线程名称才可见。
示例:
windows系统的快速失败机制---fastfail
windows系统的快速失败机制---fastfail,是一种用于“快速失败”请求的机制 — 一种潜在破坏进程请求立即终止进程的方法。 无法使用常规异常处理设施处理可能已破坏程序状态和堆栈至无法恢复的的严重故障。 使用 __fastfail 终止进程开销最少。
快速失败请求是独立的请求,通常只需执行两个指令。 一旦执行快速失败请求后,内核就会采取相应的行动。 在用户模式代码中,引发速快速失败事件时,除指令指针本身外不存在任何内存依赖项。 即使存在严重的内存破坏,也可最大限度地提高其可靠性。
用户模式开始失败显示为第二个机会非持续性异常,异常代码为 0xC0000409,至少包含一个异常参数。 第一个异常参数为 code 值。 此异常代码对 Windows 错误报告 (WER) 和调试基础结构指示进程已损坏并且应采取最少的进程内操作以响应故障。 内核模式快速失败请求可以通过使用专用检错代码 KERNEL_SECURITY_CHECK_FAILURE (0x139) 实现。 在这两种情况下,都没有调用异常处理程序,因为程序预期处于损坏状态。 如果存在调试程序,就有机会在终止进程之前检查程序的状态。
Windows 8 开始支持本机快速失败机制。 不支持本机快速失败指令的 Windows 操作系统通常会将快速失败请求视为访问冲突,或视为 UNEXPECTED_KERNEL_MODE_TRAP 错误检查。 在这些情况下,仍然会终止程序,但并不一定会快速终止。
windows提供了一个内部专用API来实现这种机制---__fastfail,
原型如下:
void __fastfail(unsigned int code);