在验证XML时崩溃为xerces

时间:2017-09-19 05:49:45

标签: c++ gdb xerces xerces-c

当我尝试使用Xerces-c验证XML时,我的应用程序有时会崩溃。

这是堆栈跟踪:

#0  0x000000000064ead0 in xercesc_3_2::XMLMutex::lock() ()
#1  0x000000000064eb32 in xercesc_3_2::XMLMutexLock::XMLMutexLock(xercesc_3_2::XMLMutex*) ()
#2  0x00000000005c8d5d in xercesc_3_2::XMLScanner::commonInit() ()
#3  0x00000000005c6ff7 in xercesc_3_2::XMLScanner::XMLScanner(xercesc_3_2::XMLValidator*, xercesc_3_2::GrammarResolver*, xercesc_3_2::MemoryManager*) ()
#4  0x00000000006caf59 in xercesc_3_2::IGXMLScanner::IGXMLScanner(xercesc_3_2::XMLValidator*, xercesc_3_2::GrammarResolver*, xercesc_3_2::MemoryManager*) ()
#5  0x00000000006858aa in xercesc_3_2::XMLScannerResolver::getDefaultScanner(xercesc_3_2::XMLValidator*, xercesc_3_2::GrammarResolver*, xercesc_3_2::MemoryManager*) ()
#6  0x00000000005da3f8 in xercesc_3_2::AbstractDOMParser::initialize() ()
#7  0x00000000005da163 in xercesc_3_2::AbstractDOMParser::AbstractDOMParser(xercesc_3_2::XMLValidator*, xercesc_3_2::MemoryManager*, xercesc_3_2::XMLGrammarPool*) ()
#8  0x00000000005e81bc in xercesc_3_2::XercesDOMParser::XercesDOMParser(xercesc_3_2::XMLValidator*, xercesc_3_2::MemoryManager*, xercesc_3_2::XMLGrammarPool*) ()
#9  0x00000000004f0323 in KEventUtils::validateXML(std::string) (this=0xdbb030, xmlFile="/mnt/lprsResults3//2017/09/18/C01/P00C013-2017091803862.xml.1.xml") at src/KEventUtils.cpp:315
#10 0x00000000004c3861 in ACSTrigger::transcodeVideo(int) (this=0xdbe170, id=0) at src/acsTrigger.cpp:1314
#11 0x00000000004cacaa in std::_Mem_fn<void (ACSTrigger::*)(int)>::operator()<int, void>(ACSTrigger*, int&&) const (this=0xdbdb50, __object=0xdbe170)
    at /usr/local/include/c++/4.8.5/functional:601
#12 0x00000000004ca9eb in std::_Bind_simple<std::_Mem_fn<void (ACSTrigger::*)(int)> (ACSTrigger*, int)>::_M_invoke<0ul, 1ul>(std::_Index_tuple<0ul, 1ul>) (this=0xdbdb40) at /usr/local/include/c++/4.8.5/functional:1732
#13 0x00000000004ca707 in std::_Bind_simple<std::_Mem_fn<void (ACSTrigger::*)(int)> (ACSTrigger*, int)>::operator()() (this=0xdbdb40)
    at /usr/local/include/c++/4.8.5/functional:1720
#14 0x00000000004ca5d0 in std::thread::_Impl<std::_Bind_simple<std::_Mem_fn<void (ACSTrigger::*)(int)> (ACSTrigger*, int)> >::_M_run() (this=0xdbdb28) at /usr/local/include/c++/4.8.5/thread:115
#15 0x00007f4635860220 in  () at /lib64/libstdc++.so.6
#16 0x00007f4634cbddc5 in start_thread () at /lib64/libpthread.so.0
#17 0x00007f4634fc821d in clone () at /lib64/libc.so.6

validateXML()是根据XML是否有效而返回true或false的函数。

我检查了传入第9帧的XML,它是有效的XML 。 检查XML的代码如下:

bool KEventUtils::validateXML(string xmlFile)
{
  try 
  {
    XMLPlatformUtils::Initialize();
  }
  catch (const XMLException& toCatch) 
  {
    char* message = XMLString::transcode(toCatch.getMessage());
    cout << "Error during initialization! :\n"
      << message << "\n";
    XMLString::release(&message);
    return false;
  }
  XercesDOMParser* parser = new XercesDOMParser();
  parser->setValidationScheme(XercesDOMParser::Val_Auto);
  parser->setValidationSchemaFullChecking( true );
  parser->setValidationConstraintFatal(true);
  parser->setDoNamespaces(true);    // optional
  parser->setDoSchema(true);    // optional
  ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
  parser->setErrorHandler(errHandler);
  try 
  {
    cout << "Parsing XML " << endl;
    parser->parse((char *)xmlFile.c_str());
  }
  catch (const XMLException& toCatch) 
  {
    char* message = XMLString::transcode(toCatch.getMessage());
    cout << "Exception message is: \n"
      << message << "\n";
    XMLString::release(&message);
    if (parser) delete parser;
    if (errHandler) delete errHandler;
    return false;
  }
  catch (const DOMException& toCatch) 
  {
    char* message = XMLString::transcode(toCatch.msg);
    cout << "Exception message is: \n"
      << message << "\n";
    XMLString::release(&message);
    if (parser) delete parser;
    if (errHandler) delete errHandler;
    return false;
  }
  catch (...) 
  {
    cout << "Unexpected Exception \n" ; 
    if (parser) delete parser;
    if (errHandler) delete errHandler;
    return false;
  }

  if(parser) delete parser;
  if(errHandler) delete errHandler;
  return true;
}

0 个答案:

没有答案