《c/c++商用工程之道》代码实现之1_debug工具

《0 bug c/c++商用工程之道》书中的一些代码很实用可惜作者没有随书发布源码,对书中部分代码进行了实现,变量函数类名及实现代码一致,能自成体系,有些地方做了稍微调整,原因在后续文章中做了说明,可供结合原书学习。


0 bug c/c++商用工程之道  5 debug工具 

#ifdef CON_DEBUG
	#define CON_PRINTF printf 
#else
	#define CON_PRINTF/\
/printf
#endif

5.1 变参数函数的设计 p182
//pDst:用户指定的输出缓冲区,nDstSize:用户指定的输出缓冲区尺寸,szFormat:格式化输出字符串
	//返回输出的字符总数,(strlen的长度,不包括最后的\'0')
	int SafePrintf(char*pDst,int nDstSize,char*szFormat,...)
	{
		int nListCount=0;
		va_list pArgList;
		if (!pDst) goto	 _EXIT_FUN;
		va_start(pArgList,szFormat);
		nListCount+=_vsnprintf(pDst+nListCount,nDstSize-nListCount,szFormat,pArgList);
		va_end(pArgList);
		if (nListCount>(nDstSize-1)) nListCount = nDstSize-1;
		*(pDst+nListCount)='\0';
_EXIT_FUN:
		return nListCount;
	}

5.2.1获得时间戳 
int GetATimeStamp(char* szBuf,int nMaxLength)
{
	int nLength=0;
	// 		time_t t;
	// 		struct tm*pTM=NULL;
	// 		time(&t);
	// 		pTM= localtime(&t);
	// 		nLength= base::safe_printf(szBuf,nMaxLength,"%s",asctime(pTM));

	SYSTEMTIME tm;
	GetLocalTime(&tm);
	nLength= SafePrintf(szBuf,nMaxLength,"%02d-%02d-%02d,%02d:%02d:%02d-%03d",tm.wYear,tm.wMonth,tm.wDay,tm.wHour,tm.wMinute,tm.wSecond,tm.wMilliseconds );
	szBuf[nLength-1]='\0';
	return nLength;
}

 5.3 二进制输出的debug函数
//输出格式 0000-00 00 00 00   00 00 00 00   00 00 00 00   00 00 00 00   ***************
int dbg_bin_ascii(char* pPrintBuffer,char*pBuffer,int nLength)
{
	int i;
	int nCount=0;
	for (i=0;i<nLength;i++)
	{
		//ascii字符表中可显示字符代码>32
		if (32<=*(pBuffer+i))
		{
			nCount+= SafePrintf(pPrintBuffer+nCount,256,"%c",*(pBuffer+i));
		}
		else
		{
			nCount+= SafePrintf(pPrintBuffer+nCount,256,".");
		}
	}
	return nCount;


}

//以16进制显示指定数据区内容
int dbg_bin_hex(char* pPrintBuffer,char*pBuffer,int nLength)
{
	int i=0;
	int j=0;
	int nCount=0;
	for (i=0;i<nLength;i++)
	{
		nCount+= SafePrintf(pPrintBuffer+nCount,256,"%02X",(unsigned char)*(pBuffer+i));
		j++;
		if (4==j)
		{
			j=0;
			nCount+= SafePrintf(pPrintBuffer+nCount,256," ");
		}
	}
	if (16>nLength)//每行打印16字节
	{
		for (;i<16;i++)
		{
			nCount+= SafePrintf(pPrintBuffer+nCount,256,"    ");
			j++;
			if (4==j)
			{
				j=0;
				nCount+= SafePrintf(pPrintBuffer+nCount,256," ");
			}

		}
	}

    return nCount;
}

//调用函数,16字节为一行,格式化输出二进制内容,该函数还没写完,有待调试
void dbg_bin(char*pBuffer,int nLength)
{
	int nAddr=0;
	int nLineCount=0;
	int nBufferCount =nLength;
	int n=0;
	char szLine[256];
	if(0<nLength)
	{
		while (1)
		{
			n=0;
			n+= SafePrintf(szLine+n,256-n,"%p-",pBuffer+nAddr);
			nLineCount=16;
			if (nBufferCount<nLineCount)
			{
				nLineCount=nBufferCount;
			}
			n+=dbg_bin_hex(szLine+n,pBuffer+nAddr,nLineCount);
			n+=dbg_bin_ascii(szLine+n,pBuffer+nAddr,nLineCount);

			CON_PRINTF("%s\n",szLine);

			nAddr+=16;
			nBufferCount-=16;
			if (0>=nBufferCount) break;
		}
		CON_PRINTF("\n");
	}
	else CON_PRINTF("dbg_bin error length=%d\n",nLength);	

}
来源:http://blog.csdn.net/lezhiyong




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值