c++ 服务器程序bug dump

调试服务器程序时最怕遇到需要运行10天半个月才遇到一次的bug,这种bug很难还原现场,同时还要时刻注意服务器是否挂掉。

本文给出一个解决方法可以极大的提高调试效率。

使用本文方法可以在断言失败时自动dump,可用于还原bug环境进行调试。另外崩溃时也会自动记录crash dump。

断言函数

bool xassert(bool r){

    if(!r)    __asm int 3
   return r;
}

最终异常处理函数,遇到这里的话说明程序只能挂掉了,写crash dump

LONG	WINAPI 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);
	}
	return	EXCEPTION_CONTINUE_SEARCH;
}

最先异常处理函数,用于处理xassert里面的int 3,写调试dump

LONG WINAPI FirstExceptionHandler(PEXCEPTION_POINTERS pEi){

	switch(pEi->ExceptionRecord->ExceptionCode){
		//所有的软件断点都是我提交的
		case	EXCEPTION_BREAKPOINT://软件断点int3 0xcc
		{
			static	int	nDump=0;
			static	char	tmp[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;

			return	EXCEPTION_CONTINUE_EXECUTION;

		}break;
		case	EXCEPTION_SINGLE_STEP://debug 硬件断点
		{
		}break;
	}
	return	EXCEPTION_CONTINUE_SEARCH;
}

最后在程序初始化时加上

	AddVectoredExceptionHandler(0,FirstExceptionHandler);
	SetUnhandledExceptionFilter(LastExceptionHandler);

代码原理。

xassert失败时执行一个int3指令,产生调试中断

使用异常处理函数捕获调试中断,用debugAPI写dump后恢复到调试指令下一条继续执行。

最终异常处理函数捕获所有未能处理的异常,写crash dump后程序自动崩溃。

时间: 2024-10-29 06:06:38

c++ 服务器程序bug dump的相关文章

Linux服务器程序规范

除了网络通信外,服务器程序还必须考虑许多其他细节问题,零碎,但基本上时模板式的. ---引 Linux服务器程序一般以后台形式运行.后台程序又称守护进程.它没有控制终端,因而也不会意外接受用户输入.守护进程的父进程一般是init进程(pid=1). Linux服务器程序通常有一套日志系统,它至少能输出日志到文件,有的高级服务器可以输出日志到专门的UDP服务器.大部分后台进程都在/var/log下有自己的日志目录. Linux服务器程序一般以某个专门的非root身份运行.mysqld, httpd

服务器程序DEBUG

服务器端设定 Tomcat 默认我们启动Tomcat是使用下边的命令 ./catalina.sh start 如果想DEBUG的话,只需要加一个参数打开JPDA(Java Platform Debugger Architecture)就可以了 ./catalina.sh jpda start 注:默认的监听端口是8000,如果想修改这个端口的话,可以修改环境变量JPDAADDRESS. 如果我们的服务器是通过daemon.sh启动的tomcat话,貌似没有找到默认打开JPDA的方法,我们可以环境

Python实现简单的http服务器程序

主要的需求是这样的,需要调用服务器端的程序获取GPU服务器的信息并且返回给前端显示出来,那么就需要完成一个服务器端的程序,获取服务器的数据之后将数据返回(以JSON格式). 效果如下图: 页面没有内容是因为服务程序还没有启动.下面完成服务器程序: #!/usr/bin/python from bottle import route,run,template import os from bottle import get,post,request import re gpu_info_dict

UNIX网络编程卷1 回射服务器程序 TCP服务器程序设计范式 四个版本

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 这是一个简单的回射服务器程序.它将客户发送的数据读入缓冲区并回射其中内容 下面我会介绍同一个使用 TCP 协议的回射服务器程序的几个不同版本,分别是 fork 版本.select 版本.poll 版本.多线程版本 fork 版本:为每一个客户连接派生(fork) 一个子进程用来处理客户请求 /** * TCP/IPv4 协议相关 * **/ #include "unp.h" in

完成端口与高性能服务器程序开发

原文出处:http://blog.csdn.NET/roen/archive/2007/03/19/1533378.aspx 以一个文件传输服务端为例,在我的机器上它只起两个线程就可以为很多个客户端同时提供文件下载服务,程序的性能会随机器内CPU个数的增加而线性增长,我 尽可能做到使它清晰易懂,虽然程序很小却用到了NT 5的一些新特性,重叠IO,完成端口以及线程池,基于这种模型的服务端程序应该是NT系统上性能最好的了. 首先.做为完成端口的基础,我们应该理解重叠IO,这需要你已经理解了内核对象及

程序Bug导致了天大的损失,要枪毙程序员吗?

转自 http://www.cocoachina.com/programmer/20160331/15835.html 号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句号.这个判例将对 IT 行业产生深远的影响:如果程序的 bug 导致了巨大的经济损失,应该由谁来承担?用户?运营商?还是系统开发商? bug:计算机程序里的错误 今天故事的主角是,

TCP客户/服务器程序概述

一个回射服务器: 1)客户从标准输入读入一行文本,并写给服务器 2)服务器从网络输入读入这行文本,并回射给客户 3)客户从网络输入读入这行回射文本,并显示在标准输出上 回射输入行这样一个客户/服务器程序是一个尽管简单然而有效的网络程序例子 实现任何客户/服务器网络应用所需的所有基本步骤可通过本例子阐述 若想把本例子扩充成你自己的应用程序,你只需修改服务器对来自客户的输入的处理过程 除了以正常的方式运行本例子的客户和服务器(即键入一行文本并观察它的回射)之外 我们还会讨论它的许多边界条件: 客户和

nodejs的简单服务器程序

下面是参考<Jquery.Jquery UI 及Jquery Mobile>一书中的nodej服务器程序 var http = require('http'), url = require('url'), fs = require('fs'); http.createServer(function (req, res) { var reqData = { url: url.parse(req.url, true), method: req.method, headers: req.header

服务器程序注意事项

1. 在服务器程序时,很容易出现内存泄露.以及内存溢出等问题. 出现这些问题往往会导致程序无法正常运行,比如异常退出.阻塞.然而,在发生这些错误的时候往往会令人很困惑,因为这些错误很难被发现.解决这些问题往往会耗费大量的时间.因而保持良好的代码习惯对一个程序的健壮性具有重要的意义,也是一个优秀的程序员所应该具备的素质. 2. 服务端程序往往是部署在Unix等服务器之上的,并且需要长久的运行. 在这种情况下,很多时候对程序的调试都是比较不方便的.所以,保留日志等将为我们的后期的Debug提供很大的