windows下捕获dump
namespace CatchDumpFile
{ void simple_log(const std::wstring& log_msg); class CDumpCatch
{
public:
CDumpCatch();
~CDumpCatch();
private: static LPTOP_LEVEL_EXCEPTION_FILTER WINAPI TempSetUnhandledExceptionFilter(LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter);
static BOOL ReleaseDumpFile(const std::wstring& strPath, EXCEPTION_POINTERS *pException);
static LONG WINAPI UnhandledExceptionFilterEx(struct _EXCEPTION_POINTERS *pException);
static void MyPureCallHandler(void);
static void MyInvalidParameterHandler(const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t pReserved); BOOL AddExceptionHandle();
BOOL RemoveExceptionHandle();
BOOL PreventSetUnhandledExceptionFilter();
void SetInvalidHandle();
void UnSetInvalidHandle();
private:
LPTOP_LEVEL_EXCEPTION_FILTER m_preFilter;
_invalid_parameter_handler m_preIph;
_purecall_handler m_prePch;
};
};
.cc
namespace CatchDumpFile
{
void simple_log(const std::wstring& log_msg)
{
std::wstring strLogWnd = L"cswuyg_simple_debug_log";
HWND hSend = ::FindWindow(NULL, strLogWnd.c_str());
COPYDATASTRUCT copydate;
copydate.cbData = (DWORD)(log_msg.length() + ) * sizeof(wchar_t);
copydate.lpData = (PVOID)log_msg.c_str();
::SendMessage(hSend, WM_COPYDATA, , (LPARAM)©date);
} void CDumpCatch::MyPureCallHandler(void)
{
//simple_log(L"MyPureCallHandler");
throw std::invalid_argument("");
} void CDumpCatch::MyInvalidParameterHandler(const wchar_t* expression, const wchar_t* function, const wchar_t* file, unsigned int line, uintptr_t pReserved)
{
//simple_log(L"MyPureCallHandler");
//The parameters all have the value NULL unless a debug version of the CRT library is used.
throw std::invalid_argument("");
} void CDumpCatch::SetInvalidHandle()
{
#if _MSC_VER >= 1400 // MSVC 2005/8
m_preIph = _set_invalid_parameter_handler(MyInvalidParameterHandler);
#endif // _MSC_VER >= 1400
m_prePch = _set_purecall_handler(MyPureCallHandler); //At application, this call can stop show the error message box.
}
void CDumpCatch::UnSetInvalidHandle()
{
#if _MSC_VER >= 1400 // MSVC 2005/8
_set_invalid_parameter_handler(m_preIph);
#endif // _MSC_VER >= 1400
_set_purecall_handler(m_prePch); //At application this can stop show the error message box.
} LPTOP_LEVEL_EXCEPTION_FILTER WINAPI CDumpCatch::TempSetUnhandledExceptionFilter( LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter )
{
return NULL;
} BOOL CDumpCatch::AddExceptionHandle()
{
m_preFilter = ::SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);
PreventSetUnhandledExceptionFilter();
return TRUE;
} BOOL CDumpCatch::RemoveExceptionHandle()
{
if(m_preFilter != NULL)
{
::SetUnhandledExceptionFilter(m_preFilter);
m_preFilter = NULL;
}
return TRUE;
} CDumpCatch::CDumpCatch()
{
SetInvalidHandle();
AddExceptionHandle();
} CDumpCatch::~CDumpCatch()
{
UnSetInvalidHandle();
RemoveExceptionHandle();
} BOOL CDumpCatch::ReleaseDumpFile(const std::wstring& strPath, EXCEPTION_POINTERS *pException)
{
HANDLE hDumpFile = ::CreateFile(strPath.c_str(), GENERIC_WRITE, , NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hDumpFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}
MINIDUMP_EXCEPTION_INFORMATION dumpInfo;
dumpInfo.ExceptionPointers = pException;
dumpInfo.ThreadId = ::GetCurrentThreadId();
dumpInfo.ClientPointers = TRUE;
// ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);
BOOL bRet = ::MiniDumpWriteDump(::GetCurrentProcess(), ::GetCurrentProcessId(), hDumpFile, MiniDumpWithFullMemory, &dumpInfo, NULL, NULL);
::CloseHandle(hDumpFile);
return bRet;
} LONG WINAPI CDumpCatch::UnhandledExceptionFilterEx( struct _EXCEPTION_POINTERS *pException )
{
//simple_log(L"UnhandledExceptionFilterEx");
wchar_t szPath[MAX_PATH] = { };
::GetModuleFileName(NULL, szPath, MAX_PATH);
::PathRemoveFileSpec(szPath);
std::wstring strPath = szPath;
strPath += L"\\CrashDumpFile.dmp";
BOOL bRelease = ReleaseDumpFile(strPath.c_str(), pException);
//::FatalAppExit(0, L"Error");
if (bRelease)
{
return EXCEPTION_EXECUTE_HANDLER;
}
return EXCEPTION_CONTINUE_SEARCH;
} BOOL CDumpCatch::PreventSetUnhandledExceptionFilter()
{
HMODULE hKernel32 = LoadLibrary(L"kernel32.dll");
if (hKernel32 == NULL)
{
return FALSE;
}
void *pOrgEntry = ::GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");
if(pOrgEntry == NULL)
{
return FALSE;
} unsigned char newJump[];
DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
dwOrgEntryAddr += ; //jump instruction has 5 byte space. void *pNewFunc = &TempSetUnhandledExceptionFilter;
DWORD dwNewEntryAddr = (DWORD)pNewFunc;
DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr; newJump[] = 0xE9; //jump
memcpy(&newJump[], &dwRelativeAddr, sizeof(DWORD));
SIZE_T bytesWritten;
DWORD dwOldFlag, dwTempFlag;
::VirtualProtect(pOrgEntry, , PAGE_READWRITE, &dwOldFlag);
BOOL bRet = ::WriteProcessMemory(::GetCurrentProcess(), pOrgEntry, newJump, , &bytesWritten);
::VirtualProtect(pOrgEntry, , dwOldFlag, &dwTempFlag);
return bRet;
} }
class IPureCall
{
public:
virtual ~IPureCall(){};
IPureCall()
{
//indirect call the virtual function, the compiler would not treat as "static binding", it is "dynamic binding".
//At this time, the CPureCall class hasn't been constructed, the virtual table didn't has the pure_call function's point, so it cause "pure virtual function called exception".
call_by_constructor();
};
virtual void pure_call() = ;
void call_by_constructor()
{
pure_call();
}
}; class CPureCall : public IPureCall
{
public:
CPureCall()
{
}
void pure_call()
{
}
};
windows下捕获dump的更多相关文章
- windows下捕获dump之守护进程
一两个月前为产品写了一个独立的exe,由于产品使用的捕获dump是一个现成的进程外exe,如果以资源的方式集成它容易出现安全警告,由于时间关系没有寻求新的解决方法,还是遵循旧方案,不捕获dump. 最 ...
- windows下捕获dump之Google breakpad_client的理解
breakpad是Google开源的一套跨平台工具,用于dump的处理.很全的一套东西,我这里只简单涉及breakpad客户端,不涉及纯文本符号生成,不涉及dump解析. 一.使用 最简单的是使用进程 ...
- windows下捕获dump之Google breakpad_client
breakpad是Google开源的一套跨平台工具,用于dump的处理.很全的一套东西,我这里只简单涉及breakpad客户端,不涉及纯文本符号生成,不涉及dump解析. 一.使用 最简单的是使用进程 ...
- Windows下获取Dump文件以及进程下各线程调用栈的方法总结(转)
1. Dump文件的用途 Dump文件, 主要用于诊断一个进程的运行状态,尤其是碰到崩溃(Crash)或者挂起(hang)不响应时,需要分析它的工作状态. 除了平时常见的attach到这个进程, 分 ...
- windows下捕获本地回环网络中的报文RawCap
一.下载地址: 官网地址:https://www.netresec.com/?page=RawCap 百度云:链接:https://pan.baidu.com/s/1mWCOTRF5XicuJitBA ...
- Google Breakpad 在 windows下捕获程序崩溃报告
http://blog.csdn.net/goforwardtostep/article/details/56304285
- Windows下 dmp文件的产生
一.windows下的崩溃捕获windows程序当遇到异常,没有try-catch或者try-catch也无法捕获到的异常时,程序就会自动退出.windows系统默认是不产生程序dmp文件的.dump ...
- 原创 C++应用程序在Windows下的编译、链接:第三部分 静态链接(二)
3.5.2动态链接库的创建 3.5.2.1动态链接库的创建流程 动态链接库的创建流程如下图所示: 在系统设计阶段,主要的设计内容包括:类结构的设计以及功能类之间的关系,动态链接库的接口.在动态链接库中 ...
- 记一次windows下物理迁移数据库的过程
背景: 最近因为一次设备故障,导致一台运行windows环境下的机器无法启动,里面有一个正在使用的财务数据库,该数据库也只是每月使用一次,需要把物理数据迁移出来,于是拔出了故障机器的硬盘,通 ...
随机推荐
- C/C++内存泄漏及检测 转
C/C++内存泄漏及检测 2011-02-20 17:51 by 吴秦, 30189 阅读, 13 评论, 收藏, 编辑 “该死系统存在内存泄漏问题”,项目中由于各方面因素,总是有人抱怨存在内存泄漏, ...
- css3,环绕圆环 loading,小组件
一个loading的小组件, 给其他模块调用.先上图 type:cat type:ball 第一幅loading,老鼠是一个圆形的背景图片,已经转成base64. 小猫也是图片 也已经转成base64 ...
- DDL和DML的定义和区别
DML(Data Manipulation Language)数据操纵语言: 适用范围:对数据库中的数据进行一些简单操作,如insert,delete,update,select等. DDL(Data ...
- apiCloud中图片裁剪模块FNImageClip的使用
思路 1.获取需裁剪图片的地址 2.跳转到裁剪页面 3.裁剪成功返回新图片地址 4.替换原有图片地址 增加修饰和事件 str += '<li class="tu image" ...
- JAVASCRIPT事件详解-------原生事件基础....
javaScirpt事件详解-原生事件基础(一) 事件 JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间,通过监听特定事件的发生,你能 ...
- (一)MII/MDIO接口详解
本文主要分析MII/RMII/SMII,以及GMII/RGMII/SGMII接口的信号定义,及相关知识,同时本文也对RJ-45接口进行了总结,分析了在10/100模式下和1000M模式下的设计方法. ...
- md5加密过程
import java.beans.Encoder; import java.security.MessageDigest; import java.security.NoSuchAlgorithmE ...
- Android的启动模式(上)
1. 基本介绍 大家平时只要懂一点Android知识的话,都一定会知道,一个应用的组成,往往包含了许多的activity组件,每个activity都应该围绕用户的特定动作进行跳转设计.比如说,一个电话 ...
- 本地获取System权限CMD方法汇总(转)
本地获取System权限CMD方法汇总(转) 稍微整理了下,大概有三种方法可以本地获取system权限的cmd,但前提都是当前用户具备administrator权限. 下面列举的三种方法各有千秋,看你 ...
- Spring MVC 数据绑定(四)
Spring支持多种形式的类型绑定,包括: 1.基本数据类型.String和String[] 2.简单对象类型 3.List类型 4.Set类型 5.Map类型 6.复合数据类型 接下 ...