如何给自己的程序添加BugReport
2016-01-09 16:39
274 查看
借助MiniDumpWriteDump函数把崩溃进程的调用堆栈、CPU寄存器等信息写入本地文件。然后我们可以调用我们的BugReport.exe程序,让他发送Dump文件给服务器,然后重启客户端程序。
LONG __stdcall MyExceptionFun( LPEXCEPTION_POINTERS lpExcept)
{
wchar_t szMsg[1024]={0};
wsprintf(szMsg, L"Error address:0x%x, error code:%u\n CPU register:eax=0x%x, ebx=0x%x, ecx=0x%x, edx=0x%x", \
lpExcept->ExceptionRecord->ExceptionAddress, lpExcept->ExceptionRecord->ExceptionCode,\
lpExcept->ContextRecord->Eax, lpExcept->ContextRecord->Ebx, lpExcept->ContextRecord->Ecx, lpExcept->ContextRecord->Edx);
//MessageBox(NULL, szMsg, L"异常详细信息:", MB_OK|MB_ICONERROR);
SL_LOG(szMsg);
HANDLE hProcess=GetCurrentProcess();
DWORD dwProcessID=GetProcessId(hProcess);
HANDLE hFile=CreateFile(L"c:\\exception.dmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE!=hFile && GetLastError()!=ERROR_ALREADY_EXISTS )
{
MINIDUMP_EXCEPTION_INFORMATION mei;
mei.ThreadId=GetCurrentThreadId();
mei.ExceptionPointers=lpExcept;
mei.ClientPointers=FALSE;
MiniDumpWriteDump(hProcess, dwProcessID, hFile, MiniDumpWithProcessThreadData, &mei, NULL, NULL);
CloseHandle(hFile);
}
return EXCEPTION_EXECUTE_HANDLER;
}
切记,返回EXCEPTION_EXECUTE_HANDLER告诉系统这个崩溃我们已经处理了,系统就不会弹出那个可恶的崩溃对话框出来。
最重要的是在Main函数入口调用API:
::SetUnhandledExceptionFilter(MyExceptionFun);
MSDN说明:
After calling this function, if an exception occurs in a process that is not being debugged, and the exception makes it to the unhandled exception filter, that filter will call the exception filter
function specified by the lpTopLevelExceptionFilterparameter.
LONG __stdcall MyExceptionFun( LPEXCEPTION_POINTERS lpExcept)
{
wchar_t szMsg[1024]={0};
wsprintf(szMsg, L"Error address:0x%x, error code:%u\n CPU register:eax=0x%x, ebx=0x%x, ecx=0x%x, edx=0x%x", \
lpExcept->ExceptionRecord->ExceptionAddress, lpExcept->ExceptionRecord->ExceptionCode,\
lpExcept->ContextRecord->Eax, lpExcept->ContextRecord->Ebx, lpExcept->ContextRecord->Ecx, lpExcept->ContextRecord->Edx);
//MessageBox(NULL, szMsg, L"异常详细信息:", MB_OK|MB_ICONERROR);
SL_LOG(szMsg);
HANDLE hProcess=GetCurrentProcess();
DWORD dwProcessID=GetProcessId(hProcess);
HANDLE hFile=CreateFile(L"c:\\exception.dmp", GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if ( INVALID_HANDLE_VALUE!=hFile && GetLastError()!=ERROR_ALREADY_EXISTS )
{
MINIDUMP_EXCEPTION_INFORMATION mei;
mei.ThreadId=GetCurrentThreadId();
mei.ExceptionPointers=lpExcept;
mei.ClientPointers=FALSE;
MiniDumpWriteDump(hProcess, dwProcessID, hFile, MiniDumpWithProcessThreadData, &mei, NULL, NULL);
CloseHandle(hFile);
}
return EXCEPTION_EXECUTE_HANDLER;
}
切记,返回EXCEPTION_EXECUTE_HANDLER告诉系统这个崩溃我们已经处理了,系统就不会弹出那个可恶的崩溃对话框出来。
最重要的是在Main函数入口调用API:
::SetUnhandledExceptionFilter(MyExceptionFun);
MSDN说明:
After calling this function, if an exception occurs in a process that is not being debugged, and the exception makes it to the unhandled exception filter, that filter will call the exception filter
function specified by the lpTopLevelExceptionFilterparameter.
相关文章推荐
- JSOI2015 day1
- MySQL高级三——循环语句
- ubuntu14.04 server python2.7 安装 numpy scipy matplotlib
- PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
- 创建SpringMVC前端配置文件DispatcherServlet总是ClassNotFoundException
- Linux平台安装MongoDB常见异常
- android高仿微信联系人选择
- Java中String的探究
- <LeetCode OJ> 46. Permutations
- Property's synthesized getter follows Cocoa naming convention for returning 'owned' objects(2012-01-
- CentOS6系统启动过程说明
- MySQL使用
- android ndk环境配置
- web创建form表单验证码
- linuxmint安装配置
- Android - AlertDialog
- apache的源码安装详细过程全纪录
- java泛型,枚举的意义
- Android 自己定义ViewGroup 实战篇 -> 实现FlowLayout
- MyEclipse 中没有 add hibernate capabilities 的解决方法