程序发生崩溃dump文件_failed to create dump file

程序发生崩溃dump文件_failed to create dump file之前在winxp和win7没有问题,用了win10就出问题了.解决办法:VirtualProtect函数使用VirtualProtectEx代替即可!所有代码如下:#ifndef__DUMP_H__#define__DUMP_H__#include<stdlib.h>#include<stdio.h>#include<ostream>#if…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

之前在win xp和win7没有问题,用了win10就出问题了.
解决办法:VirtualProtect函数使用VirtualProtectEx代替即可!

所有代码如下:

#ifndef __DUMP_H__
#define __DUMP_H__
#include <stdlib.h>
#include <stdio.h>
#include <ostream>
#ifdef _MSC_VER
#include <windows.h>
#include <DbgHelp.h>
#pragma comment(lib, "dbghelp.lib")

#ifndef _M_IX86  
#error "The following code only works for x86!"  
#endif  

inline BOOL IsDataSectionNeeded(const WCHAR* pModuleName)
{
	if (pModuleName == 0)
	{
		return FALSE;
	}

	WCHAR szFileName[_MAX_FNAME] = L"";
	_wsplitpath_s(pModuleName, NULL, 0, NULL, 0, szFileName, _MAX_FNAME, NULL, 0);

	if (_wcsicmp(szFileName, L"ntdll") == 0)
		return TRUE;

	return FALSE;
}

inline BOOL CALLBACK MiniDumpCallback(PVOID                            pParam,
	const PMINIDUMP_CALLBACK_INPUT   pInput,
	PMINIDUMP_CALLBACK_OUTPUT        pOutput)
{
	if (pInput == 0 || pOutput == 0)
		return FALSE;

	switch (pInput->CallbackType)
	{
	case ModuleCallback:
		if (pOutput->ModuleWriteFlags & ModuleWriteDataSeg)
			if (!IsDataSectionNeeded(pInput->Module.FullPath))
				pOutput->ModuleWriteFlags &= (~ModuleWriteDataSeg);
	case IncludeModuleCallback:
	case IncludeThreadCallback:
	case ThreadCallback:
	case ThreadExCallback:
		return TRUE;
	default:;
	}

	return FALSE;
}

inline void CreateMiniDump(EXCEPTION_POINTERS* pep, LPCTSTR strFileName)
{
	HANDLE hFile = CreateFile(strFileName, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

	if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
	{
		MINIDUMP_EXCEPTION_INFORMATION mdei;
		mdei.ThreadId = GetCurrentThreadId();
		mdei.ExceptionPointers = pep;
		mdei.ClientPointers = NULL;

		MINIDUMP_CALLBACK_INFORMATION mci;
		mci.CallbackRoutine = (MINIDUMP_CALLBACK_ROUTINE)MiniDumpCallback;
		mci.CallbackParam = 0;

		//dump信息较多
		MINIDUMP_TYPE mdt = (MINIDUMP_TYPE)(
			MiniDumpWithPrivateReadWriteMemory |
			MiniDumpWithFullMemory |
			MiniDumpWithDataSegs |
			MiniDumpWithHandleData |
			MiniDumpWithFullMemoryInfo |
			MiniDumpWithThreadInfo |
			MiniDumpWithUnloadedModules |
			MiniDumpWithIndirectlyReferencedMemory |
			MiniDumpWithFullAuxiliaryState |
			MiniDumpWithPrivateWriteCopyMemory |
			MiniDumpIgnoreInaccessibleMemory |
			MiniDumpWithTokenInformation |
			MiniDumpFilterMemory
			);
		MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(),
			hFile, mdt, (pep != 0) ? &mdei : 0, 0, &mci);

		//MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, (pep != 0) ? &mdei : 0, NULL, &mci);  //普通dump,小

		CloseHandle(hFile);
	}
}




std::ostream& operator<<(std::ostream& os, const EXCEPTION_RECORD& red)
{
	return os << "   Thread ID:" << GetCurrentThreadId()
		<< "   ExceptionCode: " << red.ExceptionCode << "/n"
		<< "   ExceptionFlags: " << red.ExceptionFlags << "/n"
		<< "   ExceptionAddress: " << red.ExceptionAddress << "/n"
		<< "   NumberParameters: " << red.NumberParameters;
}


LONG WINAPI GPTUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo)
{
	FILE *fp;
	fopen_s(&fp, "DumpInfo.txt", "a+");
	char buffer[256];
	sprintf_s(buffer, "%s", "   Server Dead,CreatDump!!\n");

	static char __time[1024];
	SYSTEMTIME s;
	GetLocalTime(&s);
	sprintf_s(__time, "[%d-%d-%d %d:%d:%d]", s.wYear, s.wMonth, s.wDay, s.wHour, s.wMinute, s.wSecond);

	fwrite(__time, strlen(__time), 1, fp);
	fwrite(buffer, strlen(buffer), 1, fp);
	fclose(fp);

	//StackWalker sw;
	//sw.ShowCallstack();//actionlog.txt

	CreateMiniDump(pExceptionInfo, "Exception.dmp");
	//std::cerr << "未知错误:" << (*pExceptionInfo->ExceptionRecord) << std::endl;
	//exit(pExceptionInfo->ExceptionRecord->ExceptionCode);

	return EXCEPTION_EXECUTE_HANDLER;    // 程序停止运行
}

// 此函数一旦成功调用,之后对 SetUnhandledExceptionFilter 的调用将无效  
void DisableSetUnhandledExceptionFilter()
{
	void* addr = (void*)GetProcAddress(LoadLibrary("kernel32.dll"), "SetUnhandledExceptionFilter");

	if (addr && !IsBadReadPtr(addr, sizeof(void*)))
	{
		unsigned char code[16];
		int size = 0;
		code[size++] = 0x33;
		code[size++] = 0xC0;
		code[size++] = 0xC2;
		code[size++] = 0x04;
		code[size++] = 0x00;

		DWORD dwOldFlag, dwTempFlag;
		if (VirtualProtectEx(GetCurrentProcess(), addr, size, PAGE_EXECUTE_READWRITE, &dwOldFlag) == 0)
			return;
		WriteProcessMemory(GetCurrentProcess(), addr, code, size, NULL);
		VirtualProtectEx(GetCurrentProcess(), addr, size, dwOldFlag, &dwTempFlag);
	}
}

void InitMinDump()
{
	//注册异常处理函数  
	SetUnhandledExceptionFilter(GPTUnhandledExceptionFilter);

	//使SetUnhandledExceptionFilter  
	DisableSetUnhandledExceptionFilter();
}
#endif
#endif

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194571.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • sm4加密和sm3加密

    sm4加密和sm3加密sm4加密有32位key值加密和16位key值加密加粗样式sm4中32位加密:可以参考:https://www.npmjs.com/package/@haici/gmsm4sm4中16位加密:可以参考:https://blog.csdn.net/qq_34574204/article/details/107961807?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162501640416780366595087%2522%252C%

    2022年10月5日
    3
  • 【⚠️windows删除文件夹抽风了⚠️】“错误0x80070091:目录不是空的”问题处理

    有时候我们想要删除一些无用的文件,但是删除的时候缺发现无法删除文件提示“错误0x80070091:目录不是空的”的问题,下面小编就详细的为大家介绍无法删除空文件夹提示“错误0x80070091:目录不是空的”通用解决方法。具体解决方法如下:1、首先呢,我们随便复制一个文件。(比如我复制自己桌面这个图片)2、“BT”这个文件夹根目录有两个文件夹。3、打开第一个文件夹,一直打开到最后一个文件夹,粘贴之前复制的文件。4、打开第二个文件…

    2022年4月9日
    224
  • IntellijIdea 非Maven项目打Jar包

    IntellijIdea 非Maven项目打Jar包  一、以SpringBoot项目为例,在未使用maven的情况下将其打成Jar包。  二、将其打成散包,即项目依赖的Jar包在目录同级或子级。好处是如果项目更新,只需要更新项目的jar,不需要更新所有。  一、检查项目是否包含META-INF文件夹。     若包含META-INF文件夹,将其删除。等下重新生成。  二、构建Artifacts  2.1选择菜…

    2022年6月19日
    160
  • java算法大全_java经典算法_算法面试题大全含答案

    java算法大全_java经典算法_算法面试题大全含答案1、Java中用到的线程调度算法是什么?2、java二叉树算法面试题大全含答案3、java笔试手写算法面试题大全含答案4、java递归算法练习:使用递归算法写个程序计算n!5、JVM的常见垃圾回收算法6、《java算法大全》第一期7、《java算法大全》第三期8、《java算法大全》第二期9、《java算法大全》第五期10、《java算法大全》第四期11、《java经典算法》之…

    2022年7月18日
    20
  • InvocationHandle的invoke方法[通俗易懂]

    InvocationHandle的invoke方法[通俗易懂]在学习代理模式中接触到了动态代理的相关内容,这是AOP的核心内容。先用一个例子说明动态代理的使用//接口(动态代理只能代理接口)publicinterfaceSubject{publicvoidrequest();}//接口实现:实现了Subject的request()方法publicclassRealSubjecti

    2022年5月30日
    38
  • 英文搜索网站_DFS搜索

    英文搜索网站_DFS搜索给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。示例 1:输入:board = [[“o”,”a”,”a”,”n”],[“e”,”t”,”a”,”e”],[“i”,”h”,”k”,”r”],[“i”,”f”,”l”,”v”]], words = [“oath”,

    2022年8月9日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号