c++ 服务器程序bug dump
来源:互联网 发布:ubuntu查看光纤卡wwn? 编辑:程序博客网 时间:2024/06/03 16:28
调试服务器程序时最怕遇到需要运行10天半个月才遇到一次的bug,这种bug很难还原现场,同时还要时刻注意服务器是否挂掉。
本文给出一个解决方法可以极大的提高调试效率。
使用本文方法可以在断言失败时自动dump,可用于还原bug环境进行调试。另外崩溃时也会自动记录crash dump。
断言函数
bool xassert(bool r){
if(!r) __asm int 3 return r;}
最终异常处理函数,遇到这里的话说明程序只能挂掉了,写crash dump
LONGWINAPI LastExceptionHandler(PEXCEPTION_POINTERS pEi){auto h=CreateFile("crash.dmp",GENERIC_WRITE,0,nullptr,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,nullptr);if(h!=INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATION mei;mei.ClientPointers=false;mei.ThreadId=GetCurrentThreadId();mei.ExceptionPointers=pEi;MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),h,MiniDumpWithPrivateReadWriteMemory,&mei,nullptr,nullptr);CloseHandle(h);}returnEXCEPTION_CONTINUE_SEARCH;}最先异常处理函数,用于处理xassert里面的int 3,写调试dump
LONG WINAPI FirstExceptionHandler(PEXCEPTION_POINTERS pEi){
switch(pEi->ExceptionRecord->ExceptionCode){//所有的软件断点都是我提交的caseEXCEPTION_BREAKPOINT://软件断点int3 0xcc{staticintnDump=0;staticchartmp[1024];_snprintf_s(tmp,1000,"debug%02d.dmp",++nDump);auto h=CreateFile(tmp,GENERIC_WRITE,0,nullptr,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,nullptr);if(h!=INVALID_HANDLE_VALUE){MINIDUMP_EXCEPTION_INFORMATION mei;mei.ClientPointers=false;mei.ThreadId=GetCurrentThreadId();mei.ExceptionPointers=pEi;MiniDumpWriteDump(GetCurrentProcess(),GetCurrentProcessId(),h,MiniDumpWithPrivateReadWriteMemory,&mei,nullptr,nullptr);CloseHandle(h);}pEi->ContextRecord->Eip+=1;returnEXCEPTION_CONTINUE_EXECUTION;}break;caseEXCEPTION_SINGLE_STEP://debug 硬件断点{}break;}returnEXCEPTION_CONTINUE_SEARCH;}
最后在程序初始化时加上
AddVectoredExceptionHandler(0,FirstExceptionHandler);SetUnhandledExceptionFilter(LastExceptionHandler);
代码原理。
xassert失败时执行一个int3指令,产生调试中断
使用异常处理函数捕获调试中断,用debugAPI写dump后恢复到调试指令下一条继续执行。
最终异常处理函数捕获所有未能处理的异常,写crash dump后程序自动崩溃。
0 0
- c++ 服务器程序bug dump
- c\c++出bug调试技巧 —— 如何利用windbg + dump + map分析程序异常 .
- Memory dump and bug
- M&C程序Bug解决
- Linux C 让程序崩溃后生成Core Dump
- GCC Coverage代码分析-GCC如何编译生成gcov/gcov-dump程序及其bug分析
- C/C++程序BUG检查方法步骤
- core dump 调试程序
- C#TCP服务器简单程序
- UNIX/C:core dump
- Objective-C Class Dump
- Objective-C Class Dump
- Objective-C Class Dump
- [C]dump内存函数
- 调试经验谈-根据crash dump查找bug
- WINCE 下使用DUMP查找BUG
- WINCE 下使用DUMP查找BUG
- WINCE 下使用DUMP查找BUG异常
- kill和kill -9
- 动态设置Activity背景图
- Java JSON解析的两种常用方式
- Andorid 网络流量统计
- mail.log的一个文档中读取并过滤出mail地址
- c++ 服务器程序bug dump
- 管理者不要“好为人师”
- python初学过程的一些小练习题
- Java随记
- 二叉树遍历
- 安卓 GPS设置
- jQuery看到哪学到哪
- Tomcat内存设置详解
- centos 无法访问apache下的网站