如何给自己的程序添加BugReport
2015-04-23 22:50
423 查看
借助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 lpTopLevelExceptionFilter parameter.
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 lpTopLevelExceptionFilter parameter.
相关文章推荐
- 如何在Blackfin上已移植的uClinux系统中添加自己编写的程序
- ubuntu 11.10如何将自己的程序添加到应用程序中?
- zynq开发中如何向文件系统里添加自己的程序
- 如何给自己程序通过命令行添加logging.properties文件
- 如何添加Features,处理自己的程序
- 如何查看hadoop程序中自己添加的日志
- 如何给自己的程序添加BugReport
- 如何在自己的程序中添加appWidget(附简单代码)
- 《Windows小应用》如何将一个自己download的zip文件安装的程序添加到系统服务中
- 如何利用C++ Builder 5.0 Enterprise 创建用户自己的网上聊天程序
- 如何在gluster的源码中添加自己的xlator
- 今天根据自己搭建maven项目的心得,给大家介绍一下maven如何添加依赖jar包
- CIV 如何在自己的程序中调用外部程序
- 如何添加自己封装的代码到Cocoapod
- 如何保护自己的程序?Diffie-Hellman的另类用法
- 如何用自己的图片作程序背景
- 如何让WINCE系统启动直接运行自己的程序
- 如何将友盟反馈的案例移植到自己的程序上。
- 给自己的Blog程序添加对Windows Live Writer的支持
- Linux系统中如何添加自己的库文件路径