va_end(args)会导致崩溃吗?

时间:2014-01-24 10:08:47

标签: c++ variadic-functions

我们的服务器进程在从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

0 个答案:

没有答案