当前位置: 技术问答>linux和unix
自己写的一个日志类出现BUG,求帮忙查找原因
来源: 互联网 发布时间:2016-12-11
本文导语: 本帖最后由 oneonenight 于 2011-07-04 13:52:49 编辑 不是一运行就有错,而是长期运行才出的错,出错定位在下面这个方法: void CLog::WriteLog(LEVEL_TYPE level, const char* szTitle, const char* format,...) { //[时间][等级][标...
void CLog::WriteLog(LEVEL_TYPE level, const char* szTitle, const char* format,...)
{
//[时间][等级][标题][文件:函数][内容]
char chTmp[20] = {0}; //时间字符串
char szMsg[MAX_LOG_LENGTH + 1]; //日志信息字符串
// 输入检查
if (NULL == format)
{
return;
}
// 日期时间
strcpy(szMsg,"[");
struct tm *newtime;
time_t long_time;
time( &long_time );
newtime = localtime( &long_time );
sprintf(chTmp, "%04d%02d%02d %02d:%02d:%02d" ,newtime->tm_year + 1900,
newtime->tm_mon + 1,newtime->tm_mday,newtime->tm_hour,newtime->tm_min,newtime->tm_sec);
strcat(szMsg,chTmp);
strcat(szMsg, "]");
// 等级
strcat(szMsg, "[");
strcat(szMsg, LOG_ERROR[level]);
strcat(szMsg, "]");
// 标题
if (NULL != szTitle)
{
strcat(szMsg,"[");
strcat(szMsg, szTitle);
strcat(szMsg,"]: ");
}
strcat(szMsg, "n");
// 内容
va_list argp;
va_start(argp,format);
vsnprintf(&szMsg[strlen(szMsg)], MAX_LOG_LENGTH - strlen(szMsg), format, argp);
va_end(argp);
strcat(szMsg, "n");
// 输出日志
this->PrintLog(szMsg);
}
用GDB调试的错误信息如下:
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x4aa10940 (LWP 24281)]
0x00000034688797c0 in strlen () from /lib64/libc.so.6
(gdb) bt
#0 0x00000034688797c0 in strlen () from /lib64/libc.so.6
#1 0x0000003468846b69 in vfprintf () from /lib64/libc.so.6
#2 0x000000346886988a in vsnprintf () from /lib64/libc.so.6
#3 0x000000000042669e in CLog::WriteLog(._35, const char *, const char *, ...) (this=0x65dc20, level=LEVEL_INFO,
szTitle=0x43bc1c "parse task",
format=0x2aaad0002c20 " 03001 1 2 107", '0' , "429 107", '0' , "429 107", '0' ...)
at log/log.cpp:63
根据提示应该是vsnprintf出错了,但不知道为什么出错,怎么解决。
|
这个函数是怎么调用的呢?
完整的调用语句是什么
完整的调用语句是什么