2011-02-25 60 views
0

我正在使用libxml2(libxml2-2.7.8) 我在处理XMl文件后调用xmlFreeTextReader时发生崩溃。 我没有线索中为什么会发生的事情:libxml2:xmlFreeTextReader崩溃

以下是我使用的代码:

int parseDevDescMessage(char *buffer, DMXDevice *dmxLocal) 
{ 
    //xmlDocPtr xmlDocPointer; 
    xmlTextReaderPtr xmlTextPointer; 
    int   errorCode=0; 
    const xmlChar *name, *value; 
    char   *xmlBuffer; 
    xmlNode  *rootElement = NULL; 
    xmlNode  *currentNode = NULL; 

    devServices *devServicesLocal=NULL; 
    devServices *devServicesLocalAdd=NULL; 

    /* 
    * This initialize the library and check potential ABI mismatches 
    * between the version it was compiled for and the actual shared 
    * library used. 
    */ 
    LIBXML_TEST_VERSION 

    xmlBuffer = (char *)malloc(strlen(buffer)); 
    strcpy(xmlBuffer, buffer, strlen(buffer)); 
    /*I am doing this string copy because the variable buffer is referred in the calling function. I am assuming that xmlFreeTextReader is freeing the buffer also 

    xmlTextPointer = xmlReaderForMemory(xmlBuffer, strlen(xmlBuffer), "somthing.xml", NULL, 0); 
    if(xmlTextPointer == NULL) 
    { 
    #ifdef CTL_MSG_PARSER_DEBUG_NEW 
     printf("parseDevDescMessage : ERROR WHITE CREATING XML DOC FROM MEM\n"); 
    #endif 
    errorCode = -1; 
    goto error; 
    } 

    errorCode = xmlTextReaderRead(xmlTextPointer); 
    while(errorCode == 1) 
    { 
    if(((strcmp(xmlTextReaderConstName(xmlTextPointer),"serviceList")) == 0) && 
     ((xmlTextReaderNodeType(xmlTextPointer)) == 1) 
) 
    { 
     errorCode = xmlTextReaderRead(xmlTextPointer); 
     while(errorCode == 1) 
     { 
     if(((strcmp(xmlTextReaderConstName(xmlTextPointer),"service")) == 0) && 
      ((xmlTextReaderNodeType(xmlTextPointer)) == 1) 
     ) 
     { 
      devServicesLocal = dmxLocal->deviceServices; 

      if(!devServicesLocal) 
      { 
      devServicesLocal = (devServices *)malloc(sizeof(devServices)); 
      memset(devServicesLocal, 0, sizeof(devServices)); 
      dmxLocal->deviceServices = devServicesLocal; 
      //devServicesLocalAdd  = devServicesLocal; 
      } 
      else 
      { 
      while(devServicesLocal->nextService) 
      { 
       devServicesLocal = devServicesLocal->nextService; 
      } 
      devServicesLocal->nextService = (devServices *)malloc(sizeof(devServices)); 
      memset(devServicesLocal->nextService, 0, sizeof(devServices)); 
      devServicesLocal = devServicesLocal->nextService; 
      } 
      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 

      value = xmlTextReaderConstValue(xmlTextPointer); 
      devServicesLocal->serviceType = (char *)malloc(strlen(value)); 
      strcpy(devServicesLocal->serviceType, value); 


      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 

      value = xmlTextReaderConstValue(xmlTextPointer); 
      devServicesLocal->serviceId = (char *)malloc(strlen(value)); 
      strcpy(devServicesLocal->serviceId, value); 

      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 

      value = xmlTextReaderConstValue(xmlTextPointer); 
      devServicesLocal->SCPDURL = (char *)malloc(strlen(value)); 
      strcpy(devServicesLocal->SCPDURL, value); 


      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 

      value = xmlTextReaderConstValue(xmlTextPointer); 
      devServicesLocal->eventSubURL = (char *)malloc(strlen(value)); 
      strcpy(devServicesLocal->eventSubURL, value); 


      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 
      errorCode = xmlTextReaderRead(xmlTextPointer); 

      value = xmlTextReaderConstValue(xmlTextPointer); 
      devServicesLocal->controlURL = (char *)malloc(strlen(value)); 
      strcpy(devServicesLocal->controlURL, value); 

     } 
     else 
     { 
      errorCode = xmlTextReaderRead(xmlTextPointer); 
     } 
     } 
    } 
    else 
    { 
     errorCode = xmlTextReaderRead(xmlTextPointer); 
    } 
    } 
    error: 
    xmlMemoryDump(); 
    **xmlFreeTextReader(xmlTextPointer);** 
    xmlCleanupParser(); 
    return errorCode; 
} 

能有人请解释为什么是这样的代码崩溃时xmlFreeTextReader(xmlTextPointer)是叫做

回答

0

我用VALGRIND,发现了一些内存问题。我逐个修正了所有与内存相关的问题,最终这次崩溃消失了。 可能会在某个地方,因为这个记忆被囚禁的腐败,因为当它被释放时,它崩溃了。

感谢,

-Sun