《0 bug c/c++商用工程之道》书中的一些代码很实用可惜作者没有随书发布源码,对书中部分代码进行了实现,变量函数类名及实现代码一致,能自成体系,有些地方做了稍微调整,原因在后续文章中做了说明,可供结合原书学习。
0 bug c/c++商用工程之道 5 debug工具
#ifdef CON_DEBUG #define CON_PRINTF printf #else #define CON_PRINTF/\ /printf #endif
//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; }
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; }
//输出格式 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