// If this doesn't make sense, skip the code and come back!
void lockUnhandledExceptionFilter() {
HMODULE kernel32 = LoadLibraryA("kernel32.dll");
Assert(kernel32);
if (FARPROC gpaSetUnhandledExceptionFilter = GetProcAddress(kernel32, "SetUnhandledExceptionFilter")) {
unsigned char expected_code[] = {
0x8B, 0xFF, // mov edi,edi
0x55, // push ebp
0x8B, 0xEC, // mov ebp,esp
// only replace code we expect
if (memcmp(expected_code, gpaSetUnhandledExceptionFilter, sizeof(expected_code)) == 0) {
unsigned char new_code[] = {
0x33, 0xC0, // xor eax,eax
0xC2, 0x04, 0x00, // ret 4
BOOST_STATIC_ASSERT(sizeof(expected_code) == sizeof(new_code));
DWORD old_protect;
if (VirtualProtect(gpaSetUnhandledExceptionFilter, sizeof(new_code), PAGE_EXECUTE_READWRITE, &old_protect)) {
CopyMemory(gpaSetUnhandledExceptionFilter, new_code, sizeof(new_code));
DWORD dummy;
VirtualProtect(gpaSetUnhandledExceptionFilter, sizeof(new_code), old_protect, &dummy);
FlushInstructionCache(GetCurrentProcess(), gpaSetUnhandledExceptionFilter, sizeof(new_code));
FreeLibrary(kernel32);
64位系统请参考:
// If this doesn't make sense, skip the code and come back!void lockUnhandledExceptionFilter() { HMODULE kernel32 = LoadLibraryA("kernel32.dll"); Assert(kernel32); if (FARPROC gpaSetUn...
最近解决了一个困扰项目多年的问题:程序弹出崩溃窗口(CRT窗口,或者是调用了不可靠的第三方动态库弹出的窗口)。百度上搜索SetUnhandledExceptionFilter,都是这样的代码
---------------------------------------------------------------------------------------------------
void lockUnhandledExceptionFilter() {
HMODULE kernel32 = LoadLibraryA("kernel32.dll");
Assert(kernel32);
if (FARPROC gpaSetUnhandledExceptionFilter = GetProcAddress(kernel32, "SetUnhandle
dump文件,在VC中的调试还是非常非常非常有用的,因为我们也不会经每一行代码都加上日志,当然如果你愿意,也可以每一行都加上日志;
在Windows上,添加dump文件有两种方法:
方法一:一个是在程序中添加代码;
方法二:修改注册表(参考后面的bat文件写法,在win7上用管理员程序运行);建议用这个方法,方便实用;(http://blog.csdn.net/hgy413/article/...
很多 C/C++ 程序会设置自己的 Unhandled Exception Filter 用于捕获 Unhandled exceptions 并输出一些信息(例如,创建
mini-dump 或者输出调用栈到日志文件中)。
从 VC++2005 开始出于安全因素微软改变了 CRT 的行为。在以下情况下 CRT
通常我们通过SetUnhandledExceptionFilter来捕获程序的异常进而得到相应的dump文件,就像下面:LONG NTAPI TopLevelExcepFilter(EXCEPTION_POINTERS *pExcepInfo)
printf("TopLevelEHandler\n");
return EXCEPTION_CONTINUE_EXECUTION;
}SetUn...
1.解决思路和注意事项1.1 Set顶层异常函数
1.2 建立函数
1.3 在函数里面createprocess子进程,参数传递pid给子进程,保存父进程错误信息结构体到两个二进制文件
1.4 子进程根据pid通过openprocess获得句柄,打开两个结构体保存的二进制文件,读入。minidumpwrite2.创建子进程//代码一
#include<iostream>
#include<st
关于程序崩溃时转储内存DMP,可以设置注册表,使程序崩溃时自动转储内存DMP,见程序崩溃时利用注册表自动转储内存DMP。本文要介绍的是使用SetUnhandledExceptionFilter函数在程序崩溃时取得程序内存DMP,并解决一些困扰人的问题。
从名字上就可以看出SetUnhandledExceptionFilter的作用就是设置未捕获异常函数,程序崩溃就是因为有些异常我们没有捕
LONG WINAPI UnhandledExceptionFunction(_EXCEPTION_POINTERS* pExceptionInfo)
SYSTEMTIME st;
GetLocalTime(&st);
CStr...
// 异常处理函数
LONG WINAPI ExceptionHandler(EXCEPTION_POINTERS* ExceptionInfo) {
// 生成dump文件的路径和名称
const char* filePath = "C:\\dump\\myapp.dmp";
// 创建dump文件
HANDLE hFile = CreateFileA(filePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != INVALID_HANDLE_VALUE) {
// 写入dump文件头部
MINIDUMP_EXCEPTION_INFORMATION exceptionInfo;
exceptionInfo.ThreadId = GetCurrentThreadId();
exceptionInfo.ExceptionPointers = ExceptionInfo;
exceptionInfo.ClientPointers = FALSE;
// 写入dump文件内容
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &exceptionInfo, NULL, NULL);
// 关闭dump文件
CloseHandle(hFile);
// 继续执行程序
return EXCEPTION_CONTINUE_EXECUTION;
以上代码会在程序发生异常时生成一个名为“myapp.dmp”的dump文件,路径为“C:\dump\”。你可以根据需要修改dump文件的名称和路径。注意,如果程序没有发生异常,dump文件不会生成。
另外,如果你使用的是Visual Studio,可以在项目属性的“Debugging”选项卡中设置生成dump文件的路径和名称。这样,在程序发生异常时,Visual Studio会自动生成dump文件。