Interne Datenstrukturen beschädigt

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
ulrich Krause

Interne Datenstrukturen beschädigt

Beitrag von ulrich Krause »

Im Netzwerkbetrieb bekomme ich unregemäßig beim Schließen von Dateien mit dem Befehl USE vorher Select mit Dateiname (select SDKUNDE) bzw. beim Select auf eine Datei (select SDKUNDE) die Fehlermeldung BASE/5 interne Datenstrukturen beschädigt. ´Die Dateien sind definitiv offen entweder shared oder exclusiv. Bei der Anwendung handelt es sich um eine allte Clipper-Anwendung die mit x-Base compiliert wurde. Unter Clipper traten die Fehler nie auf. Was kann mann machen um den Fehler zu unterbinden.
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Ulrich.

Welche Xbase-Version?

Und wenn 1.9: Hotfix zur NTXDBE.DLL eingespielt?
Herzlich,
Tom
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi,

wie sieht denn deine dbesys.prg aus ? Welchen dbeload machst du denn?
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
ulrich Krause

Beitrag von ulrich Krause »

Hallo Tom und Rolf,
ich benutze die NTXDBE.DLL version 1.900330 und habe bekomme bei dbesetdefault() den Standard "DBFNTX" angezeigt.

Gruß Ulrich
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: Interne Datenstrukturen beschädigt

Beitrag von AUGE_OHR »

hi,
ulrich Krause hat geschrieben: Im Netzwerkbetrieb bekomme ich unregemäßig beim Schließen von Dateien mit dem Befehl USE vorher Select mit Dateiname (select SDKUNDE) bzw. beim Select auf eine Datei (select SDKUNDE) die Fehlermeldung BASE/5 interne Datenstrukturen beschädigt.
Was für ein Netzwerk ? Opportunistic locking ?
ulrich Krause hat geschrieben: Unter Clipper traten die Fehler nie auf.
Das ist ja auch eine DOS Anwendung und funktioniert bei sperren ganz
anderes als Windows.

gruss by OHR
Jimmy
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

deshalb arbeite ich bei xbase gar nicht mehr mit select, sondern öffne die Datenbanken immer mit New
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Der Runtime-Error "Interne Datenstrukturen beschädigt" hat nach Aussage des Supportes von Alaska NICHTS mit DBF-Dateien zu tun, sondern mit Problemen im Arbeitsspeicher (der Begriff ist verwirrend).

Angeblich kann ein solcher Runtime-Error nur nach "unsachgemäßem" Gebrauch der C-Api oder DLL-Calls von Fremd-DLLs (nicht Xbase-Dlls) auftreten. Ich kenne diese "Internen Datenstrukturen" zu hauf. In der Tat konnte ich das Auftreten bei meinen Kunden reduzieren. Ich hatte z. B. eine zeitlang eine BAP.DLL benutzt, die nicht zur verwendeten Xbase-Version gepasst hat. Durch die Verwendung der richtigen BAP.DLL wurde die Anzahl der "Interne Datenstrukturen"-Abstürze deutlich verringert.

Eine weitere Ursache scheint es zu sein, wenn es bei Aufruf von Nicht-Xbase-Dlls (wir verwenden z. B. eine Delphi-DLL) zu Exceptions innerhalb der Dll kommt, die dort nicht abgefangen sind. Auch damit lassen sich "Interne Datenstrukturen"-Abstürze produzieren.

Laut Aussage des Supportes muss übrigens der Absturz nicht unmittelbar nach dem Aufruf der Fremd-Dll-Funktion (oder C-API) kommen, sondern evtl. auch später, weil eben ein Speicherbereich korumpiert ist.
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Markus Walter hat geschrieben: Der Runtime-Error "Interne Datenstrukturen beschädigt" hat nach Aussage des Supportes von Alaska NICHTS mit DBF-Dateien zu tun, sondern mit Problemen im Arbeitsspeicher (der Begriff ist verwirrend).
Das was du meinst bezieht sich auf activex. Der Thread hier geht aber
über das öffnen von DBF´s und da gibt es auch die Meldung.

Wenn man Probleme bei USE, CLOSE, GOTO() oder ähnlichen hat sollte
man zuerst seine DBESYS.PRG erweitern und das timeing hochsetzten.

Wenn das Problem dann noch im M$ Netzwerk auftaucht muss man die
Opportunistic locking setting setzten bzw. bei Novell TurboFAT überprüfen.

gruss by OHR
Jimmy
Benutzeravatar
Markus Walter
Programmier-Gott
Programmier-Gott
Beiträge: 1018
Registriert: Di, 24. Jan 2006 10:22
Wohnort: Saarland

Beitrag von Markus Walter »

Hi Jimmy,

das was ich meine hat auch nichts mit activex zu tun. Diese Fehlermeldung kenne ich schon aus früheren Xbase-Zeiten (1.7 / 1.82).

Und ich kann mich nur wiederholen: Laut Aussage des Alaska-Supports haben diese Fehler nichts mit dem DBE-Subsystem zu tun, sondern deuten immer auf einen ungültigen Speicherbereich hin, der angeblich nicht durch reinen Xbase-Code entstehen kann, sondern nur nach Benutzung der C-Api oder externen DLL-Funktionen. So hat Alaska das mir gegenüber immer dargestellt. Durchaus kann es aber sein, dass der Runtime-Error dann irgendwann im Code auftritt (nachdem der Speicherbereich korumpiert ist), auch eben bei DB-Funktionen.

Und meine eigenen Beobachtungen bestätigen dies:
- falsche BAP.DLL führte vermehrt zu diesem Error
- mit "schlecht programmierten" Fremd-Dll-Funktionen kann man den Error produzieren.
Gruß
Markus

Mitglied der XUG Saarland-Pfalz
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Rolf Ramacher »

Hi Markus,

was passiert denn, wenn die bap.dll sich im Verzeichnis des Programms befindet und eine bap.dll einer anderen Version im windows\system32
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9367
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 102 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Rolf.

Dann dürfte die DLL im Programm-Ausführungsverzeichnis Vorrang haben. Welche DLLs woher geladen werden, sagt Dir SysInfo (Zubehör -> Systemprogramme -> Systeminformationen oder Ausführen -> msinfo32.exe). Dort: Softwareumgebung -> Geladene Module.
Herzlich,
Tom
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Rolf,
eine DLL wird immer erst im aktuellen Verzeichnis gesucht und dann im Pfad (der Reihe nach).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Markus Walter hat geschrieben: das was ich meine hat auch nichts mit activex zu tun.
war nur ein Verweis das man da die "selbe" Fehlermeldung bekommt
Markus Walter hat geschrieben: Und ich kann mich nur wiederholen: Laut Aussage des Alaska-Supports haben diese Fehler nichts mit dem DBE-Subsystem zu tun, sondern deuten immer auf einen ungültigen Speicherbereich hin, der angeblich nicht durch reinen Xbase-Code entstehen kann, sondern nur nach Benutzung der C-Api oder externen DLL-Funktionen.
grundsätzlich hast du recht, aber wie schon gesagt "die" Meldung gibt
es auch im anderen Zusammenhang.
ulrich Krause hat geschrieben: Im Netzwerkbetrieb ... beim Schließen von Dateien mit dem Befehl USE
... BASE/5 interne Datenstrukturen beschädigt.
das ist der BASE/5 Error meistens mit Gencode 41
0005 - [BASE] - ???
Associated with: "41:Internal data structures corrupted"
Caused by: Various things, including: "Memory(0)", ":UpdateBuffer()",
"AppEvent()", "ValType()", etc.
Remarks: Also in Fatal Error Logs: "EH: 5"/"OS: 0"/"XPP: 41",
"Function: atmStartGCThread(void*)", "Module: ATM"
es geht also um DBF USE
Markus Walter hat geschrieben: Und meine eigenen Beobachtungen bestätigen dies:
- falsche BAP.DLL führte vermehrt zu diesem Error
- mit "schlecht programmierten" Fremd-Dll-Funktionen kann man den Error produzieren.
yup, aber wie schon gesagt ich glaube nicht das Ulrich überhaupt etwas
in der Art in seiner Application hat, den dazu ist die eigendliche Frage
nach BASE/5 doch echt zu simple (und tausend mal beantwortet was
man mit der DBESYS.PRG machen muss)
Tom hat geschrieben: Und wenn 1.9: Hotfix zur NTXDBE.DLL eingespielt?
du meinst den No. #9 ?
schon mal No. #9 und No. #11 unter Novell getested ? (Client NW 4.91x)

gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12909
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Beitrag von AUGE_OHR »

hi,
Martin Altmann hat geschrieben: eine DLL wird immer erst im aktuellen Verzeichnis gesucht und dann im Pfad (der Reihe nach).
zu einbinden in Xbase++ Application

gruss by OHR
Jimmy

Code: Alles auswählen

*+²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²
*+
*+    Genius by Günter Beyes and Auge & OHR, Jimmy
*+
*+    Functions: Procedure dllVER()
*+
*+²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²

#include "dll.ch"
#include "Directry.ch"

*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
*+
*+    Procedure main()
*+
*+±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±±
PROCEDURE main()
   dllVER()
RETURN

PROCEDURE dllVER
LOCAL aDLLfiles := DIRECTORY("*.DLL")  // local *.DLL files
LOCAL nPosi                                     // > 0 found in aDLLlist
LOCAL lFlag     := .F.                          // external DLLload()
LOCAL cWinDir   := GETENV("windir")             // windows path
LOCAL cWinSys   := GETENV("windir")+"\system32" // windows\system32 path
LOCAL cXppPath  := GETENV("XPPROOT")+"LIB"      // XPP LIB path
LOCAL I
LOCAL J
LOCAL nLast     := 1
LOCAL DllName                                   // name of Dll
LOCAL hDll                                      // handle of DLLload()
LOCAL aVersion                                  // Array Version
LOCAL fVersion                                  // Array Version
LOCAL cDLLpath                                  // DLL load Path
LOCAL aDLLlist  := {{"ADAC20B.DLL"      ,4},;   // if you have more DLL
                    {"ADAC20C.DLL"      ,4},;
                    {"ASCOM10.DLL"      ,4},;
                    {"ASCOM10C.DLL"     ,4},;
                    {"ASLOGRESOURCE.DLL",4},;
                    {"ASRDBC10.DLL"     ,4},;
                    {"BAP.DLL"          ,4},;
                    {"CDXDBE.DLL"       ,4},;
                    {"DBFDBE.DLL"       ,4},;
                    {"DELDBE.DLL"       ,4},;
                    {"EVENTSPY.DLL"     ,4},;
                    {"FOXDBE.DLL"       ,4},;
                    {"MEMWATCH.DLL"     ,4},;
                    {"NTXDBE.DLL"       ,4},;
                    {"SDFDBE.DLL"       ,4},;
                    {"SOM.DLL"          ,4},;
                    {"XPPDBGC.DLL"      ,4},;
                    {"XPPNAT.DLL"       ,4},;
                    {"XPPRT1.DLL"       ,4},;
                    {"XPPRT2.DLL"       ,4},;
                    {"XPPUI1.DLL"       ,4},;
                    {"XPPUI2.DLL"       ,4},;
                    {"XPPUI3.DLL"       ,4}}    // include your DLL here

   SET ALTER TO DLLVER.TXT
   SET ALTER ON

   FOR I := 1 TO LEN(aDLLfiles)
      //
      // find local DLL in aDLLlist
      //
      nPosi := ASCAN(aDLLlist,{| x | x[1] = TRIM(UPPER(aDLLfiles[I,F_NAME])) })
      IF nPosi > 0
         //
         // set local flag
         //
         aDLLlist[nPosi][2] = 1
      ELSE
         //
         // add local DLL to aDLLlist
         //
         AADD(aDllList,{aDLLfiles[I,F_NAME],1})
      ENDIF
   NEXT

   //
   // where DLL might can be load from
   //
   FOR I := 1 TO LEN(aDllList)
      DllName := aDllList[I][1]

      DO CASE
         CASE aDllList[I][2] = 1

         CASE FILE(ConvToAnsiCP(cWinSys+""+DllName))
            aDllList[I][2] = 2

         CASE FILE(ConvToAnsiCP(cWinDir+""+DllName))
            aDllList[I][2] = 3

         CASE FILE(ConvToAnsiCP(cXppPath+""+DllName))
            aDllList[I][2] = 4

         OTHERWISE
            aDllList[I][2] = 5
      ENDCASE
   NEXT

   //
   // now sort it
   //
   ASORT( aDllList,,, {|aX,aY| str(aX[2])+aX[1] < str(aY[2])+aY[1]  })

   FOR I := 1 TO LEN(aDllList)

      IF .NOT. (nLast = aDllList[I][2])
         nLast := aDllList[I][2]
         ? REPLICATE("-",77)
         ? ""
      ENDIF
      //
      // use this DLL
      //
      DllName := aDllList[I][1]

      DO CASE
         CASE aDllList[I][2] = 1
            ? "*** LOCAL *** "+DllName

         CASE aDllList[I][2] = 2
            ? "*** SYS * "+cWinSys+""+DllName

         CASE aDllList[I][2] = 3
            ? "*** WIN * "+cWinDir+""+DllName

         CASE aDllList[I][2] = 4
            ? "*** LIB * "+cXppPath+""+DllName

         OTHERWISE
            ? DllName+" not found"
      ENDCASE

      //
      // if not allready automatic load
      //
      IF !DllInfo(DllName,DLL_INFO_LOADED)
         hDll  := DllLoad(DllName,NIL,.T.)
         lFlag := .T.
      ENDIF

      //
      // get handle and load Information into Array
      //
      hDll     := DllInfo(DllName,DLL_INFO_HANDLE)
      fVersion := LoadResource(1,hDll,RES_VERSIONFIXED)
      aVersion := LoadResource(1,hDll,RES_VERSION)

      cDLLpath := DllInfo( hDll, DLL_INFO_PATHNAME )
      ? "load from "+cDLLpath
      ? ""

      //
      // Main Information
      //
      IF LEN(fVersion) > 0
         ? "Product Version: "+LTRIM(STR(fVersion[RES_PRODVER_MS]))+LTRIM(STR(fVersion[RES_PRODVER_LS]))
         ? "   File Version: "+LTRIM(STR(fVersion[RES_FILEVER_MS]))+LTRIM(STR(fVersion[RES_FILEVER_LS]))
         ? "      File Time: "+LTRIM(STR(fVersion[RES_FILETIME_MS]))+LTRIM(STR(fVersion[RES_FILETIME_LS]))
      ELSE
         ? "Product Version: "+"no Information"
         ? "   File Version: "+"no Information"
         ? "      File Time: "+"no Information"
      ENDIF

      //
      // Detail Information
      //
      IF LEN(aVersion) > 0
         FOR J := 1 TO LEN(aVersion)
            ? aVersion[J][RES_VERSION_KEY]+": "+aVersion[J][RES_VERSION_VALUE]
         NEXT
      ELSE

      ENDIF
      ? ""

      //
      // when using DLLload() so DLLUnload now
      //
      IF lFlag
         lFlag := .F.
         DllUnload(hDll)
      ENDIF

   NEXT

   SET ALTER OFF
   SET ALTER TO

   RunShell( "DLLVER.TXT", "NOTEPAD.EXE", .T. ) 

RETURN

*+ EOF: DLLVER.PRG
ulrich Krause

Beitrag von ulrich Krause »

Erstmal vielen Dank für die unterschiedlichen Lösungsansätze.
Ich habe in der Zwischenzeit auch einiges ausprobiert. Meine Test und auch einige Veränderungen habe zu einer Verbesserung geführt. Ich habe die richtigen Einstellungen und dll's. Daran kann es nicht liegen. Es muss in irgendeiner Form an der Speicherbelegung und Verwaltung liegen. Ich habe einen Fehler, das eine offene Datei mit dem selct Befehl nicht angesprochen werden kann einmal produzieren können und zwar in dem ich mehr als 100 mal sehr schnell von einen Menü in ein anderes verzweigt bin. Immer nur durch den Tastendruck von ESC und ENTER. Irgendwann habe ich dann ein Menü Aufgerufen, das als erstes einen select auf eine offene Datei macht. Es kam zu Absturz mit dem gencode 66 "Datenbank Alias existiert nicht" operation dbselcarea. Dies kann nicht sein, da die Datenbank immer offen ist und nie im Programm geschlossen wird.
Zuletzt geändert von ulrich Krause am Do, 11. Okt 2007 16:37, insgesamt 1-mal geändert.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Ulrich,
die Meldung kommt aber auch, wenn Du eine Datei öffnest, die bereits exklusiv geöffnet ist!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
ulrich Krause

Beitrag von ulrich Krause »

Meine Dateien sind alle shared geöffnet.
Antworten