You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-users@xerces.apache.org by Westy <ro...@gmail.com> on 2007/04/03 22:16:04 UTC

DOMWriter heap corruption

Hi,

I'm using Xerces 2.7.0, with Visual Studio 2005.

I am experiencing what appears to be a heap corruption issue with the
DOMWriter in the code below, the error doesn't occur until main() is
exitting.

I read where others had similar issues, but their problems seemed to go away
when then added a call to release() of the DOMWriter.  I have the call to
release and still have the same issue.

Does anyone see anything else I'm doing wrong?

Incidentally, I had the same issue with using the latest code from Xerces
3.0.0 and the DOMSerializer, so it might be something I'm not doing in terms
of memory for the std::string ..

Thanks,

-Westy


ERROR:

In dbgheap.c:
Windows has triggered a breakpoint in TestDomWriterD.exe.
This may be due to a corruption of the heap, and indicates a bug in
TestDomWriterD.exe or any of the DLLs it has loaded.
The output window may have more diagnostic information

 CODE:

int
main(int argC, char* argV[])
{
  std::string outXML;
  std::string aggregationXml = fileToString("./data/stips.xml" );
  AggregationEngine::parseTest(aggregationXml, outXML);
}

int AggregationEngine::parseTest(std::string &aggregationXML, std::string
&outXML)
{
  outXML = domToString(aggregationXML);
}

std::string domToString(std::string &xmlSrc)
{
  XercesDOMParser *parser;
  std::string sXML;
  DOMNode *doc;

  try {
    XMLPlatformUtils::Initialize();
  } catch( const XMLException &toCatch) {
    XERCES_STD_QUALIFIER cerr << StrX(toCatch.getMessage()) <<
XERCES_STD_QUALIFIER endl;
  }
  // Parse DOM
  parser = new XercesDOMParser;
  MemBufInputSource* memBufIS = new
MemBufInputSource((constXMLByte*)xmlSrc.c_str(), strlen(
xmlSrc.c_str()+1)*sizeof(char ), "xmlSrc", false );
  parser->parse(*memBufIS);
  delete memBufIS;
  doc = parser->getDocument();

  // Add Attributes
  // - code removed for brevity

  // Write DOM
  try
  {
    XMLCh *pCore = XMLString::transcode("Core");
    DOMImplementation* impl =
DOMImplementationRegistry::getDOMImplementation(pCore);
    DOMWriter *theWriter = impl->createDOMWriter();
    XMLCh* xXml = theWriter->writeToString(*doc);
    char *pChar = XMLString::transcode(xXml);
    sXML = pChar;
    XMLString::release(&pChar);
    XMLString::release(&xXml);
    XMLString::release(&pCore);
    theWriter->release();
  } catch (const XMLException& toCatch) {
    XERCES_STD_QUALIFIER cerr << StrX(toCatch.getMessage ()) <<
XERCES_STD_QUALIFIER endl;
  }
  delete parser;
  XMLPlatformUtils::Terminate();
  return sXML;
}

Re: DOMWriter heap corruption

Posted by Alberto Massari <am...@datadirect.com>.
Hi Rob,

At 16.58 03/04/2007 -0400, Westy wrote:
>Thanks.
>
>Actually you are seeing all of the code, I actually removed the code where
>it says "code removed" and I still get an issue.
>
>Is there any object which I'm not deleting or releasing, but should be?

I don't see any other object, but this is not the entire codebase 
(where is fileToString? and the AggregationEngine class?). Please try 
removing the Terminate call and verify if the crash disappear.

Alberto


>-Rob
>
>
>On 4/3/07, Alberto Massari <am...@datadirect.com> wrote:
>>
>>Hi Westy,
>>if you get an error when main() exits, it could be that you have some
>>static object which destructors get called after the
>>XMLPlatformUtils::Terminate() call has been performed. If the crash
>>disappears after you comment the call to Terminate, you will have to
>>discover where they have been declared (maybe in the comment "// -
>>code removed for brevity"?) and clean them up before Terminate.
>>
>>Alberto
>>
>>At 16.16 03/04/2007 -0400, Westy wrote:
>> >Hi,
>> >
>> >I'm using Xerces 2.7.0, with Visual Studio 2005.
>> >
>> >I am experiencing what appears to be a heap corruption issue with the
>> >DOMWriter in the code below, the error doesn't occur until main() is
>> >exitting.
>> >
>> >I read where others had similar issues, but their problems seemed to go
>>away
>> >when then added a call to release() of the DOMWriter.  I have the call to
>> >release and still have the same issue.
>> >
>> >Does anyone see anything else I'm doing wrong?
>> >
>> >Incidentally, I had the same issue with using the latest code from Xerces
>>
>> >3.0.0 and the DOMSerializer, so it might be something I'm not doing in
>>terms
>> >of memory for the std::string ..
>> >
>> >Thanks,
>> >
>> >-Westy
>> >
>> >
>> >ERROR:
>> >
>> >In dbgheap.c:
>> >Windows has triggered a breakpoint in TestDomWriterD.exe.
>> >This may be due to a corruption of the heap, and indicates a bug in
>> >TestDomWriterD.exe or any of the DLLs it has loaded.
>> >The output window may have more diagnostic information
>> >
>> >CODE:
>> >
>> >int
>> >main(int argC, char* argV[])
>> >{
>> >  std::string outXML;
>> >  std::string aggregationXml = fileToString("./data/stips.xml" );
>> >  AggregationEngine::parseTest(aggregationXml, outXML);
>> >}
>> >
>> >int AggregationEngine::parseTest(std::string &aggregationXML, std::string
>> >&outXML)
>> >{
>> >  outXML = domToString(aggregationXML);
>> >}
>> >
>> >std::string domToString(std::string &xmlSrc)
>> >{
>> >  XercesDOMParser *parser;
>> >  std::string sXML;
>> >  DOMNode *doc;
>> >
>> >  try {
>> >    XMLPlatformUtils::Initialize();
>> >  } catch( const XMLException &toCatch) {
>> >    XERCES_STD_QUALIFIER cerr << StrX( toCatch.getMessage()) <<
>> >XERCES_STD_QUALIFIER endl;
>> >  }
>> >  // Parse DOM
>> >  parser = new XercesDOMParser;
>> >  MemBufInputSource* memBufIS = new
>> >MemBufInputSource((constXMLByte*)xmlSrc.c_str(), strlen(
>> >xmlSrc.c_str()+1)*sizeof(char ), "xmlSrc", false );
>> >  parser->parse(*memBufIS);
>> >  delete memBufIS;
>> >  doc = parser->getDocument();
>> >
>> >  // Add Attributes
>> >  // - code removed for brevity
>> >
>> >  // Write DOM
>> >  try
>> >  {
>> >    XMLCh *pCore = XMLString::transcode("Core");
>> >    DOMImplementation* impl =
>> >DOMImplementationRegistry::getDOMImplementation(pCore);
>> >    DOMWriter *theWriter = impl->createDOMWriter();
>> >    XMLCh* xXml = theWriter->writeToString(*doc);
>> >    char *pChar = XMLString::transcode(xXml);
>> >    sXML = pChar;
>> >    XMLString::release(&pChar);
>> >    XMLString::release(&xXml);
>> >    XMLString::release(&pCore);
>> >    theWriter->release();
>> >  } catch (const XMLException& toCatch) {
>> >    XERCES_STD_QUALIFIER cerr << StrX( toCatch.getMessage ()) <<
>> >XERCES_STD_QUALIFIER endl;
>> >  }
>> >  delete parser;
>> >  XMLPlatformUtils::Terminate();
>> >  return sXML;
>> >}
>>


Re: DOMWriter heap corruption

Posted by Westy <ro...@gmail.com>.
Thanks.

Actually you are seeing all of the code, I actually removed the code where
it says "code removed" and I still get an issue.

Is there any object which I'm not deleting or releasing, but should be?

-Rob


On 4/3/07, Alberto Massari <am...@datadirect.com> wrote:
>
> Hi Westy,
> if you get an error when main() exits, it could be that you have some
> static object which destructors get called after the
> XMLPlatformUtils::Terminate() call has been performed. If the crash
> disappears after you comment the call to Terminate, you will have to
> discover where they have been declared (maybe in the comment "// -
> code removed for brevity"?) and clean them up before Terminate.
>
> Alberto
>
> At 16.16 03/04/2007 -0400, Westy wrote:
> >Hi,
> >
> >I'm using Xerces 2.7.0, with Visual Studio 2005.
> >
> >I am experiencing what appears to be a heap corruption issue with the
> >DOMWriter in the code below, the error doesn't occur until main() is
> >exitting.
> >
> >I read where others had similar issues, but their problems seemed to go
> away
> >when then added a call to release() of the DOMWriter.  I have the call to
> >release and still have the same issue.
> >
> >Does anyone see anything else I'm doing wrong?
> >
> >Incidentally, I had the same issue with using the latest code from Xerces
>
> >3.0.0 and the DOMSerializer, so it might be something I'm not doing in
> terms
> >of memory for the std::string ..
> >
> >Thanks,
> >
> >-Westy
> >
> >
> >ERROR:
> >
> >In dbgheap.c:
> >Windows has triggered a breakpoint in TestDomWriterD.exe.
> >This may be due to a corruption of the heap, and indicates a bug in
> >TestDomWriterD.exe or any of the DLLs it has loaded.
> >The output window may have more diagnostic information
> >
> >CODE:
> >
> >int
> >main(int argC, char* argV[])
> >{
> >  std::string outXML;
> >  std::string aggregationXml = fileToString("./data/stips.xml" );
> >  AggregationEngine::parseTest(aggregationXml, outXML);
> >}
> >
> >int AggregationEngine::parseTest(std::string &aggregationXML, std::string
> >&outXML)
> >{
> >  outXML = domToString(aggregationXML);
> >}
> >
> >std::string domToString(std::string &xmlSrc)
> >{
> >  XercesDOMParser *parser;
> >  std::string sXML;
> >  DOMNode *doc;
> >
> >  try {
> >    XMLPlatformUtils::Initialize();
> >  } catch( const XMLException &toCatch) {
> >    XERCES_STD_QUALIFIER cerr << StrX( toCatch.getMessage()) <<
> >XERCES_STD_QUALIFIER endl;
> >  }
> >  // Parse DOM
> >  parser = new XercesDOMParser;
> >  MemBufInputSource* memBufIS = new
> >MemBufInputSource((constXMLByte*)xmlSrc.c_str(), strlen(
> >xmlSrc.c_str()+1)*sizeof(char ), "xmlSrc", false );
> >  parser->parse(*memBufIS);
> >  delete memBufIS;
> >  doc = parser->getDocument();
> >
> >  // Add Attributes
> >  // - code removed for brevity
> >
> >  // Write DOM
> >  try
> >  {
> >    XMLCh *pCore = XMLString::transcode("Core");
> >    DOMImplementation* impl =
> >DOMImplementationRegistry::getDOMImplementation(pCore);
> >    DOMWriter *theWriter = impl->createDOMWriter();
> >    XMLCh* xXml = theWriter->writeToString(*doc);
> >    char *pChar = XMLString::transcode(xXml);
> >    sXML = pChar;
> >    XMLString::release(&pChar);
> >    XMLString::release(&xXml);
> >    XMLString::release(&pCore);
> >    theWriter->release();
> >  } catch (const XMLException& toCatch) {
> >    XERCES_STD_QUALIFIER cerr << StrX( toCatch.getMessage ()) <<
> >XERCES_STD_QUALIFIER endl;
> >  }
> >  delete parser;
> >  XMLPlatformUtils::Terminate();
> >  return sXML;
> >}
>
>

Re: DOMWriter heap corruption

Posted by Alberto Massari <am...@datadirect.com>.
Hi Westy,
if you get an error when main() exits, it could be that you have some 
static object which destructors get called after the 
XMLPlatformUtils::Terminate() call has been performed. If the crash 
disappears after you comment the call to Terminate, you will have to 
discover where they have been declared (maybe in the comment "// - 
code removed for brevity"?) and clean them up before Terminate.

Alberto

At 16.16 03/04/2007 -0400, Westy wrote:
>Hi,
>
>I'm using Xerces 2.7.0, with Visual Studio 2005.
>
>I am experiencing what appears to be a heap corruption issue with the
>DOMWriter in the code below, the error doesn't occur until main() is
>exitting.
>
>I read where others had similar issues, but their problems seemed to go away
>when then added a call to release() of the DOMWriter.  I have the call to
>release and still have the same issue.
>
>Does anyone see anything else I'm doing wrong?
>
>Incidentally, I had the same issue with using the latest code from Xerces
>3.0.0 and the DOMSerializer, so it might be something I'm not doing in terms
>of memory for the std::string ..
>
>Thanks,
>
>-Westy
>
>
>ERROR:
>
>In dbgheap.c:
>Windows has triggered a breakpoint in TestDomWriterD.exe.
>This may be due to a corruption of the heap, and indicates a bug in
>TestDomWriterD.exe or any of the DLLs it has loaded.
>The output window may have more diagnostic information
>
>CODE:
>
>int
>main(int argC, char* argV[])
>{
>  std::string outXML;
>  std::string aggregationXml = fileToString("./data/stips.xml" );
>  AggregationEngine::parseTest(aggregationXml, outXML);
>}
>
>int AggregationEngine::parseTest(std::string &aggregationXML, std::string
>&outXML)
>{
>  outXML = domToString(aggregationXML);
>}
>
>std::string domToString(std::string &xmlSrc)
>{
>  XercesDOMParser *parser;
>  std::string sXML;
>  DOMNode *doc;
>
>  try {
>    XMLPlatformUtils::Initialize();
>  } catch( const XMLException &toCatch) {
>    XERCES_STD_QUALIFIER cerr << StrX(toCatch.getMessage()) <<
>XERCES_STD_QUALIFIER endl;
>  }
>  // Parse DOM
>  parser = new XercesDOMParser;
>  MemBufInputSource* memBufIS = new
>MemBufInputSource((constXMLByte*)xmlSrc.c_str(), strlen(
>xmlSrc.c_str()+1)*sizeof(char ), "xmlSrc", false );
>  parser->parse(*memBufIS);
>  delete memBufIS;
>  doc = parser->getDocument();
>
>  // Add Attributes
>  // - code removed for brevity
>
>  // Write DOM
>  try
>  {
>    XMLCh *pCore = XMLString::transcode("Core");
>    DOMImplementation* impl =
>DOMImplementationRegistry::getDOMImplementation(pCore);
>    DOMWriter *theWriter = impl->createDOMWriter();
>    XMLCh* xXml = theWriter->writeToString(*doc);
>    char *pChar = XMLString::transcode(xXml);
>    sXML = pChar;
>    XMLString::release(&pChar);
>    XMLString::release(&xXml);
>    XMLString::release(&pCore);
>    theWriter->release();
>  } catch (const XMLException& toCatch) {
>    XERCES_STD_QUALIFIER cerr << StrX(toCatch.getMessage ()) <<
>XERCES_STD_QUALIFIER endl;
>  }
>  delete parser;
>  XMLPlatformUtils::Terminate();
>  return sXML;
>}