我们的服务器进程在从32位迁移到64位后不断崩溃。在调用va_end(args)后,coredump始终指向带有“}”的行;
428 // Reset the arg pointer
429 va_end ( args );
430 } <-------
431
我猜这次崩溃的原因是因为va_list'args'从一个函数传递到另一个函数?
代码非常大,所以我将总结一下流程。函数接收用于打印到日志文件的可变数量的参数。基本上只是作为记录功能。 va_list args被深深地传递到嵌套函数中,这里是否有可能导致崩溃的原因?见下文:
void logGeneric(string file, int line, ...)
{
try
{
va_list args;
va_start(args,line);
function1(file,line,args);
va_end(args);
}
catch(...)
{
va_end(args);
} <---- coredump points to here.
}
void function1(string file, int line, va_list args)
{
function2(file,line,args);
}
void function2(string file, int line, va_list args)
{
function3(file,line,args);
}
void function3(string file, int line, va_list args)
{
completeMessage(file,line,args);
}
void completeMessage(string file, int line, va_list args)
{
int level = va_arg ( args, int );
char* format = "";
format =va_arg(args,char*);
...(checking)...
char buff[Maxsize+1];
int ret=vsnprintf(buff,Maxsize, format, args);
...(checking)...
message = buff;
printToFile(message,line,level);
}
在32位版本中,completeMessage的函数签名是:
void completeMessage (string& file, int line, va_list& args);
但是因为我们使用了更新的gcc,所以存在编译错误:
src/DebugUtil.cpp:995: error: cannot allocate an object of abstract type 'GenericLogType'
src/GenericLogType.h:45: note: because the following virtual functions are pure within 'GenericLogType':
src/ILogType.h:117: note: virtual std::string ILogType::getCompleteLogMessage(const std::string&, int, __
va_list_tag*)
要解决该编译错误,我只是将函数更改为:
void completeMessage (string& file, int line, va_list args);
args参数的传递是否会导致崩溃?或者核心文件可能完全关闭,因为它处于发布模式......
我的gcc版本= 4.4.7
CENTOS 6.4 Linux 2.6.32-358.el6.x86_64