添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
// 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文件。