《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