dump文件调试技巧(产生Dump文件)
主函数:
#include "stdafx.h"
#include "DumpFile.h"
int _tmain(int argc, _TCHAR* argv[])
{
//SetUnhandledExceptionFilter();
DeclareDumpFile();
int aTemp = 1;
aTemp++;
int *p = NULL;
*p=1;
return 0;
}
DumpFile.h文件
#pragma once
#include <windows.h>
#include < Dbghelp.h>
#include <iostream>
#include <vector>
using namespace std;
#pragma comment(lib, "Dbghelp.lib")
namespace NSDumpFile
{
void CreateDumpFile(LPCWSTR lpstrDumpFilePathName, EXCEPTION_POINTERS *pException)
{
// 创建Dump文件
//
HANDLE hDumpFile = CreateFile(lpstrDumpFilePathName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// Dump信息
//
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// 写入Dump文件内容
//
MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
CloseHandle(hDumpFile);
}
LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
{
return NULL;
}
BOOL PreventSetUnhandledExceptionFilter()
{
HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll"));
if (hKernel32 == NULL)
return FALSE;
void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");
if(pOrgEntry == NULL)
return FALSE;
unsigned char newJump[ 100 ];
DWORD dwOrgEntryAddr = (DWORD) pOrgEntry;
dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
DWORD dwNewEntryAddr = (DWORD) pNewFunc;
DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
newJump[ 0 ] = 0xE9; // JMP absolute
memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc));
SIZE_T bytesWritten;
BOOL bRet = WriteProcessMemory(GetCurrentProcess(), pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten);
return bRet;
}
LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException)
{
//MessageBox(NULL, _T("Stop"), _T("Tip"), MB_OK);
TCHAR szMbsFile[MAX_PATH] = { 0 };
::GetModuleFileName(NULL, szMbsFile, MAX_PATH);
TCHAR* pFind = _tcsrchr(szMbsFile, '\\');
if(pFind)
{
*(pFind+1) = 0;
_tcscat(szMbsFile, _T("CrashDumpFile.dmp"));
CreateDumpFile(szMbsFile, pException);
}
// TODO: MiniDumpWriteDump
FatalAppExit(-1, _T("Fatal Error"));
return EXCEPTION_CONTINUE_SEARCH;
}
void RunCrashHandler()
{
SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);
PreventSetUnhandledExceptionFilter();
}
};
#define DeclareDumpFile() NSDumpFile::RunCrashHandler();
dump文件调试技巧(产生Dump文件)相关推荐
- PDF文件编辑技巧之PDF文件去除水印方法
PDF文件相信大家都会使用到,有时候我们不止局限于使用PDF文件还需要编辑PDF文件的时候,那么PDF文件的编辑技巧有什么呢.总所周知PDF文件的编辑是需要PDF编辑器的,编辑器的使用技巧有什么呢,好 ...
- VLC打不开视频文件调试技巧
用VLC打开TS文件,如果只有视频流的话可以打开,添加进了SRT字幕,打开失败!(暴风.QQ影音.KMPlayer都可以正常打开) 查询原因:下面是一个VLC自带的查询功能 或按快捷键Ctrl+M 打 ...
- centos7 lldb 调试netcore应用的内存泄漏和死循环示例(dump文件调试)
写个demo来玩一玩linux平台下使用lldb加载sos来调试netcore应用. 当然,在真实的产线环境中需要分析的数据和难度远远高于demo所示,所以demo的作用也仅仅只能起到介绍工具的作用. ...
- vs2008调试c语言,VS2008调试Release程序-Dump文件方式_C/C++技术分享_看流星社区 www.kanliuxing.com...
在Windows平台下用C++开发应用程序,最不想见到的情况恐怕就是程序崩溃,而要想解决引起问题的bug,最困难的应该就是调试release版本了.因为release版本来就少了很多调试信息,更何况一 ...
- vs2008 dump文件调试
引自 南海之星 用vs2008分析dump文件 双击minidump文件(*.dmp).默认会启动vs2008. 菜单Tools/Options, Debugging/Symbols,增加PDB文件 ...
- DUMP文件分析1:DUMP文件简介
1.1 DUMP文件类型 Windows下Dump文件分为两大类,内核模式Dump和用户模式Dump.内核模式Dump是操作系统创建的崩溃转储,最经典的就是系统蓝屏,这时候会自动创建内核模式的Dump ...
- sublime text3 保存文件时候名字后缀.dump问题解决
sublime text3 保存文件时候名字后缀.dump问题解决 参考文章: (1)sublime text3 保存文件时候名字后缀.dump问题解决 (2)https://www.cnblogs. ...
- oracle dump 文件解析,Oracle 常用的dump(Memory Dumps/File Dumps/Trace 文件使用示例)
一.Memory Dumps 1).Global Area ALTER SESSION SET EVENTS 'immediate trace name global_area level n'; 1 ...
- Visual Studio开发工具----调试技巧-转储文件
3.10 转储文件 3.10.1 概述 转储文件是一个快照,它显示正在执行的进程和某个时刻为应用程序加载的模块.转储文件带有堆信息的转储还包括应用程序在该点的内存快照. 在 ...
最新文章
- 数学分析高等代数考研试题荟萃[更新至2017年10月1日]
- 如何在python中显示电脑中的图片-python如何实现多个图片显示在屏幕上?
- 通过工具SecureCRTPortable将项目部署到服务器上
- Linux下安装部署ElasticSearch教程【7.10.1】
- springboot yml怎么建常量_Springboot中加载自定义的yml配置文件
- css3怎么设置logo,纯CSS3实现的LOGO标志 ABN AMRO CSS3 logo
- mysql 单表字段多少合适_复制信息记录表|全方位认识 mysql 系统库
- Raft协议安全性保证
- Web完整渗透测试实例(windows)
- 再有人问你为什么MySQL用B+树做索引,就把这篇文章发给她
- 观点 | 云原生时代来袭 下一代云数据库技术将走向何方?...
- c语言实现--单向循环链表操作
- win7安装PS2019CC启动时报d3dcompiler_47.dll的问题解决
- python 计算众数、中位数、分位数、偏度、峰度
- DGL系列之(二):使用DGL实现GCN
- 如何通过低代码平台搭建以“督办”为中心的办公管理系统
- K-th Largest Value
- 月饼事件技术还原 - 用js+Chorme来做抢电商的东西吧
- Nginx源码安装及调优配置(二)
- 复旦大学高等代数学习指导书(白皮书)的评价
热门文章
- 北航2022软件工程第二次作业——产品评测、分析与规划
- lda 可以处理中文_自然语言处理——使用词向量(腾讯词向量)
- 计统大作业Hello P2P
- 【Paper Reading】二值化网络——BNN
- Google Chrome 中的高性能网络
- 国产安卓和原生android,定制安卓和原生Android到底有哪些不同?真相了!
- opencv以图片名称为索引顺序读取多张图片
- 实时网速监测app_实时网速app下载-实时网速下载1.0.0安卓版-西西软件下载
- 怎么文字扫描识别?看完这篇你就会了
- 用opencv实现两张半透明png图片以一定透明度叠加