borlndmm.dll fehler



  • hallo leute !

    heute in der nacht hab ich nen ganz lustigen fehler gehabt.

    hab mir eine funktion zum auslesen der netzwerkkarten-daten geschrieben, was auch alles wunderpraechtig funktioniert hatte. wenn ich das proggie dann auf einen anderen meiner rechner gestartet hatte, gabe es nen fehler:
    so aehlich: zugriffsverletzung in modul borlndmm.dll. beim lesen auf...

    hab dann mal den CodeGuard aktiviert. nix gefunden. dann das gleiche mal mit MemProof und wieder nix. nach etwas laengerem suchen bin ich dann auf die stelle gekommen. es war ein delete. wenn ich das entfernt hatte, funktionierte es auf den anderen rechnern auch. jedoch zeigte mir dann CodeGuard und MemProof den memory leak an.
    irgendwann kam mir dann die idee es mit GlobalAlloc und GlobalFree zu probieren. siehe da, alles funktionierte ganz normal. auf allen rechnern.

    ich zeig euch mal kurz nen snippet wo das passierte:

    if( Result == ERROR_INSUFFICIENT_BUFFER )
       {
          pIFTable = (PMIB_IFTABLE) GlobalAlloc(GPTR, Sz); //hier zuerst mit new
          if( pIFTable )
          {
             Result = GetIfTable(pIFTable, &Sz, true);
    
             if(pIFTable->table[ID].dwType == MIB_IF_TYPE_OTHER)
                Info.TypOfInterface = "UNKNOWN";
             else if(pIFTable->table[ID].dwType == MIB_IF_TYPE_ETHERNET)
                Info.TypOfInterface = "ETHERNET";
             else if(pIFTable->table[ID].dwType == MIB_IF_TYPE_TOKENRING)
                Info.TypOfInterface = "TOKENRING";
             else if(pIFTable->table[ID].dwType == MIB_IF_TYPE_FDDI)
                Info.TypOfInterface = "FDDI";
             else if(pIFTable->table[ID].dwType == MIB_IF_TYPE_PPP)
                Info.TypOfInterface = "PPP";
             else if(pIFTable->table[ID].dwType == MIB_IF_TYPE_LOOPBACK)
                Info.TypOfInterface = "LOOPBACK";
             else if(pIFTable->table[ID].dwType == MIB_IF_TYPE_SLIP)
                Info.TypOfInterface = "SLIP";
    
             Info.Name = Info.Name.sprintf("%s",(pIFTable->table[1].bDescr));
             Info.MTU = Info.MTU.sprintf("%i",pIFTable->table[ID].dwMtu);
             Info.Speed = Info.Speed.sprintf("%i",pIFTable->table[ID].dwSpeed);
             Info.MAC=Info.MAC.sprintf("%02X:%02X:%02X:%02X:%02X:%02X",
                                        pIFTable->table[ID].bPhysAddr[0],
                                        pIFTable->table[ID].bPhysAddr[1],
                                        pIFTable->table[ID].bPhysAddr[2],
                                        pIFTable->table[ID].bPhysAddr[3],
                                        pIFTable->table[ID].bPhysAddr[4],
                                        pIFTable->table[ID].bPhysAddr[5]);
             GlobalFree(pIFTable);  //hier zuerst mit delete
          }
       }
       IP_ADAPTER_INFO *info   = NULL;
       ULONG length            = 0;
       Result                  = GetAdaptersInfo(NULL, &length);
    

    is das nun n bug von borland, oder wie is das nun ?
    hat schon jemand anders solch n prob gehabt ?

    Meep Meep



  • keiner ne idee woran das liegen koennte ?

    Meep Meep



  • Das Verhalten ist typisch dafür, dass du im dynamisch angeforderten Speicher über den reservierten Bereich hinaus Schreibzugriffe machst.

    Dann hängst es von vielen Nebenbedingungen ab, welcher Fehler sichtbar wird.


Anmelden zum Antworten