Interne Datenstrukturen beschädigt - Grund?

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

Moderator: Moderatoren

Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Interne Datenstrukturen beschädigt - Grund?

Beitrag von Christof »

Hallo,

leider kommt es an unterschiedlichen Stellen, auf unterschiedlichen Rechnern, nach unterschiedlichen Nutzungen immer mal wieder vor, dass sich mein Programm mit dem Hinweis "Interne Datenstrukturen beschädigt" verabschiedet. Das ist umso ärgerlicher, da auch manchmal anscheinend Indexdateien beschädigt werden und der Anwender das im besten Fall merkt und diese löscht, damit sie neu gebildet werden.

Ich habe natürlich hier schon nach dem Stichwort gesucht und auch einiges gefunden. Leider hilft mir das nicht weiter. Ich möchte einfach verstehen, warum so etwas passiert. Mein Code ist teilweise fast 10 Jahre alt und sicher nicht an allen Stellen optimal und ich habe auch schon so einige Verbesserungen erzielen können. Insbesondere durch die Verwendung von "einfacheren" Indexausdrücken, in denen (Public-)Variablen aufgelöst und die Inhalte eingebunden wurden.

Ich nutze ausschließlich die XBase++.DLLs und die sind auch immer im Programmverzeichnis. Verstanden habe ich schon, dass es häufig mit der Parameterübergabe zusammenhängt. Aber was kann denn tatsächlich passieren? Was könnte schief laufen bei der Parameterübergabe? Worauf muss man achten? Sind Public-Variablen per se Teufelszeug? Wie gesagt, ich würde es einfach gerne verstehen, dann habe ich auch eine Chance, darauf zu achten. Bisher bin ich der Fehlermeldung ziemlich hilflos ausgeliefert. Den Kunden sage ich, dass es am Speicher liegt. Sie sollen den PC runter- und wieder hochfahren und möglichst keine/wenige andere Programme nebenher laufen lassen. Das kann es doch aber nicht sein...

Vielleicht kann mich einfach mal jemand auf die Schienen setzen...

Ich konnte den Fehler jetzt sogar mal provozieren. Das Programm ist "sogar" mit einer XPPFATAL.TXT abgeschmiert und hat sich einfach ohne Meldung beendet. Manchmal kommt aber eben auch "Interne Datenstrukturen beschädigt". Vielleicht kann ja jemand was rauslesen?

Code: Alles auswählen

FATAL ERROR LOG 
System-Error
SYS Thread-ID: 528 
Module: MOM
Error Codes: EH: 4 Sub: 5(5) OS: 5 XPP: 40
Call Stack of Thread 1 (528):
COLORIGINTOPLEFT(1533)
@XBPCOLUMN@I@CREATE(260)
@XBPBROWSE@I@INSCOLUMN(879)
@XBPBROWSE@I@ADDCOLUMN(695)
EXPKAP(1790)
MENUSELECT(2006)
(B)MENUCREATE@0007(1437)
MAIN(1270)
Call Stack of GUI Thread (712):
File: D:\daten\_sentw\kap\KAP.exe
TimeStamp: 20120717 09:51
End of FATAL ERROR LOG.
In ExpKAP(1790) steht: oBrowse:addColumn( {|| KDEN} ,,"Engagementnummer:" ) Das Feld KDEN wird als Spalte für den Browser angegeben.
Ich hatte aber auch schon Hinweise, dass dbCloseAll() nicht funktioniert hat. Tja, eben immer mal an anderer Stelle :-(

Hier ein Beispiel, wo das Programm mit XPPERROR.LOG aussteigt. Nach dem die Funktion 3 oder 4mal aufgerufen wurde.

Code: Alles auswählen

------------------------------------------------------------------------------
FEHLERPROTOKOLL von "D:\daten\_sentw\kap\KAP.exe" Datum: 17.07.2012 10:04:55

Xbase++ Version     : Xbase++ (R) Version 1.90.355
Betriebssystem      : Windows XP 05.01 Build 02600 Service Pack 2
------------------------------------------------------------------------------
oError:args         :
          -> VALTYPE: B VALUE: {|| epeng->KE="E" .and. epeng->APSB<>"     " .and. epeng->f02_sachb_<>epeng->APSB}
          -> VALTYPE: C VALUE: epeng->KE="E" .and. epeng->APSB<>"     " .and. epeng->f02_sachb_<>epeng->APSB
oError:canDefault   : J
oError:canRetry     : N
oError:canSubstitute: N
oError:cargo        : NIL
oError:description  : Interne Datenstrukturen besch„digt
oError:filename     : 
oError:genCode      :         41
oError:operation    : DbSetFilter
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :          5
oError:subSystem    : BASE
oError:thread       :          1
oError:tries        :          0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Aufgerufen von EXPKAP(838)
Aufgerufen von MENUSELECT(2006)
Aufgerufen von (B)MENUCREATE(1437)
Aufgerufen von MAIN(1270)
Und hier der entsprechende Programmcode dazu:

Code: Alles auswählen

  case ExpWahl=10 && Engagementberater Privatkunden
    cDruckbefehl:="Engagementberater Privatkunden"
    oXbpT:SetCaption("Engagementberater Privatkunden")
    open("epeng")
    if  ConfirmBox( , ;
        "Nur GEÄNDERTE Berater am Hauptkunden?", "",;
                    XBPMB_YESNO , ;
                     XBPMB_QUESTION+XBPMB_APPMODAL+XBPMB_MOVEABLE ) = XBPMB_RET_YES
     set filter to epeng->KE="E" .and. epeng->APSB<>"     " .and. epeng->f02_sachb_<>epeng->APSB
    else
     set filter to epeng->KE="E"
    endif
    go top
    set console off
    erase("Exporte\AenderungE_Berater_PK.csv")  // Achtung: 7 fehlt normalerweise
    set printer to "Exporte\AenderungE_Berater_PK.csv"
    set print on
    do while .not. eof()
     ?? alltrim(str(epeng->kden,10,0))+","+alltrim(iif(epeng->apsb<>"     ",epeng->apsb,epeng->f02_sachb_))+chr(13)+chr(10)
     skip
    enddo
    set print off
    set printer to
    set console on
    go top
Wenn ich die ConfirmBox immer mit "Nein" beantworte, passiert nix. Bei mehrmaligem "Ja", steigt das Programm aus. Was könnte an der Filterbedinung falsch sein? Oder ist der Hinweis auf diese Zeile vielleicht gar nicht der eigentliche Grund?

DANKE :)

Gruß
Christof
Zuletzt geändert von Christof am Di, 17. Jul 2012 13:16, insgesamt 2-mal geändert.
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Koverhage »

Vielleicht hilft es wenn Du den Filter nach der Bearbeitung löscht.
Gruß
Klaus
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Christof »

Hallo Klaus,

bei jedem Ausstieg (es gibt einen "Fertig"-Button) wird ein dbCloseAll() gemacht. Zur Sicherheit auch jedes Mal, wenn die Procedur gestartet wird. Der Filter wird also immer wieder neu gesetzt.
Meinst Du, ich sollte trotzdem den Filter löschen?

Das Blöde ist, so doktert man wieder an den Symptomen rum. Eigentlich möchte ich aber mehr verstehen WARUM überhaupt interne Datenstrukturen beschädigt werden können. Bin halt kein Informatiker.

Gruß

Christof
Benutzeravatar
Scarmo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 188
Registriert: Di, 24. Jul 2007 9:17

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Scarmo »

Hallo Christof

Hast Du allenfalls "SET SMARTFILTER" oder "SET OPTIMIZE" auf "ON" gestellt? Als ich diese Schalter anfangs noch auf ON hatte, gab es teilweise auch unerklärliche Abstürze...

Gruss
Marco
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Christof »

Hallo Marco,

nein, die werden nirgends gesetzt. Oder muss ich die explizit ausschalten?

Gruß

Christof
Benutzeravatar
Scarmo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 188
Registriert: Di, 24. Jul 2007 9:17

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Scarmo »

Hallo Christof

Da das System diese Schalter ("Rushmore", "Smartfilter" und "Optimize") standardmässig auf "ON" stellt, solltest Du diese 3 Schalter explizit auf "OFF" stellen. Ich bin mir fast sicher, dass dies zu einer Verbesserung führt. :)

Gruss
Marco
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von brandelh »

Laut Handbuch ... ist beides aktiv:
Hilfe hat geschrieben:SET SMARTFILTER ON | off | <lToggle> ... Der Standardwert ist ON.
SET RUSHMORE ON | off | <lToggle> ... Der Standardwert ist ON.
ob das Abschalten sinnvoll ist, kann ich nicht beurteilen ;-)
Gruß
Hubert
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Christof »

Hallo,

Smartfilter und Rushmore haben keine spürbare Verbesserung gebracht, aber seit ich Optimize auf OFF gestellt habe, kann ich den Fehler an der getesteten Stelle nicht mehr provozieren. :D
Ist doch schon mal ein Teilerfolg. Wirklich "DANKE". Das nervt nämlich ganz schön.

Teilerfolg deswegen, weil ich den Grund dadurch immer noch nicht viel besser verstehe. Aber - wie gesagt - wenn es die Symptome heilt, ist mir geholfen. :blob8:

Gruß

Christof
Benutzeravatar
Scarmo
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 188
Registriert: Di, 24. Jul 2007 9:17

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Scarmo »

Hallo Christof

Erklären konnte ich es mir mit "SET OPTIMIZE" auch nicht, da dieser Schalter ja offenbar etwas "optimieren" sollte... Aber wie gesagt, seit ich diesen Schalter auf OFF gestellt habe, hatte ich genau dieses Problem mit den beschädigten Datenstrukturen nicht mehr. =D>

Gruss
Marco
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von brandelh »

Die Gründe für "Interne Datenstrukturen beschädigt" wurde schon öffters diskutiert.
Die grundsätzliche Erklärung ist einfach und kurz:

Die internen Speichervariablen von Xbase++ wurden durch fehlerhafte Zugriffe beschädigt, geändert, ungültig etc.
Das dürfte eigentlich mit reinem Xbase++ Code nicht vorkommen, da Xbase++ ja selbst die Daten schützen muss !

Meist tritt der Fehler auf, wenn man System-/oder Fremd-DLL aufruft und einen Fehler mit der Deklaration der Parameter bzw. der Aufrufart macht.
Hier können dann falsche Speicherbereiche überschrieben werden, das ist nie eine gute Idee ;-)
Beispiel: Statt einem Pointer wird die eigentliche Variable übergeben, der weitere Zugriff läuft schief ...
Beispiel: Xbase++ übergibt einen LONG Wert, die DLL braucht aber einen DOUBLE ...

Wenn z.B. OPTIMIZE einen solchen Fehler provoziert, liegt die Vermutung nahe, dass Xbase++ intern nicht alle Situationen
richtig / vollständig abfängt oder eben auch ein Programmfehler der selten auftritt im Xbase++ code schlummert.
Dort arbeiten ja auch nur Menschen 8)

Fazit: nicht alle Optimierungen sind immer hilfreich :D
Gruß
Hubert
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Christof »

Hallo Hubert,

wieder eine wenig mehr Licht ins Dunkel gebracht :-) Merci!

Wie oben schon mal erwähnt, nutze ich keinerlei externe DLLs. Alles reiner Xbase-Code und -Runtime. Allerdings kommen die meisten Abstürze dort zustande, wo ich mit Filtern und Browsern arbeite. Vielleicht läuft da doch was mit der Optimierung falsch. Was die Suche eben so schwer macht, ist die Tatsache, dass der Fehler erst beim xten Aufruf derselben Funktion/Prozedur auftritt.

Gruß

Christof
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:

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Martin Altmann »

Moin Christof,
nutzt Du da Indexe? Und hast vielleicht ein alltrim() (oder trim o.ä.) auf Deinem Schlüsselausdruck? Der Indexschlüssel muss immer gleich lang sein (und er sollte eine Zeichenkette sein - mit numerischen Ausdrücken habe ich auch ab und an schon mal Probleme gehabt).

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: 12908
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von AUGE_OHR »

Christof hat geschrieben:Smartfilter und Rushmore haben keine spürbare Verbesserung gebracht, aber seit ich Optimize auf OFF gestellt habe, kann ich den Fehler an der getesteten Stelle nicht mehr provozieren. :D
Ist doch schon mal ein Teilerfolg. Wirklich "DANKE". Das nervt nämlich ganz schön.
ja es ist eine "böse Falle" das OPTIMIZE auf default "on" statt "OFF" steht da es eben oft mit SET FILTER "versagt".
Christof hat geschrieben:Teilerfolg deswegen, weil ich den Grund dadurch immer noch nicht viel besser verstehe.
dazu musst du dir "nur" mal deine Daten genau ansehen denn SET FILTER "versagt" ja nicht immer ...

wenn ich mir nun deinen "Filter" ansehe

Code: Alles auswählen

epeng->KE="E" .and. epeng->APSB<>"     " .and. epeng->f02_sachb_<>epeng->APSB
frage ich mich warum du keinen Index daraus machst ? alle Felder scheinen mir aus einer DBF also "ideal" für einen Index / SCOPE !

Code: Alles auswählen

INDEX ON epeng->KE + epeng->APSB + IF(epeng->f02_sachb_<>epeng->APSB,"Y","N")
// CHR(48) = 1
cSeek := "E" + CHR(47)+"    " +"N" 
SET SOFTSEEK ON
SEEK(cSeek)
cSeek := INDEXKEY()
SET SOFTSEEK OFF

SET SCOPETOP TO cSeek
SET SCOPEBOTTOM TO "E" + "zzzzz" +"N" 
BROWSE()
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12908
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von AUGE_OHR »

Christof hat geschrieben:wo ich mit Filtern und Browsern arbeite.
Vielleicht läuft da doch was mit der Optimierung falsch.
beim browsen wird "erwartet" das der Skipper einen Datensatz zurück liefert.

du kann es aber, wenn OPTIMIZE auf default "on" steht, erleben das du bei SET FILTER keinen Treffer bekommst obwohl einer da sein müsste ...
aber manchmal ist er "da". wenn nun ein solcher "Zustand" beim browsen auftritt "crash" es :banghead: also OPTIMIZE OFF
Christof hat geschrieben:Was die Suche eben so schwer macht, ist die Tatsache, dass der Fehler erst beim xten Aufruf derselben Funktion/Prozedur auftritt.
aber eben "nicht immer" ... was eben an deinen Daten und Index liegt.

ich würde sogar "fast wetten" das es nach einem "SET INDEX TO" im Browse ohne "OFF" laufen würde.
(klar macht keinen Sinn aber es geht darum zu "zeigen" warum er crasht)
ein Index wird unter Xbase++ "anders" mitgeführt als bei Cl*pper. Die Fehlermeldung
Interne Datenstrukturen beschädigt
heisst nicht das die DBF sondern der Index nicht "stimmt" !
gruss by OHR
Jimmy
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Christof »

Hallo Martin,

nee, Alltrim() und Trim() habe ich schon lange aus meinen Indexkeys verbannt ;-) Da bin ich am Anfang auch oft drüber gestolpert.

Auch versuche ich immer, einen möglichst "einfachen" Filterausdruck aufzubauen. Nach der Art:

cFilter:="datei->Volumen>"+Str(nVolumen,9,0)+" .and. datei->kunde="+Alltrim(cKundenname)
set filter to &cFilter

Aber bei so was, kommt da ein ganz schön langer String zustande, weil es manchmal eben 50 Berater (oder Filialen oder eine Kombination daraus ) sein können:
cBeraterliste:="KDB01,KDB07,KDB12,KDB14,KDB23,KDB26,KDB31,KDB34,KDB01,KDB98"
cFilter:="datei->Volumen>"+Str(nVolumen,9,0)+" .and. datei->Berater $ "+Alltrim(cBeraterliste)
set filter to &cFilter

Das scheint aber deutlich besser zu funktionieren als (cBeraterliste müsste dann ja sogar PUBLIC sein, oder?):
cFilter:="datei->Volumen>"+Str(nVolumen,9,0)+" .and. datei->Berater $ Alltrim(cBeraterliste)"
set filter to &cFilter

Im Moment funktioniert meine Methode ganz gut.

Danke trotzdem :-) Jeder Hinweis hilft.

Gruß

Christof
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:

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Martin Altmann »

Moin,
wenn Du von langen Strings sprichst: Die sind aber nie länger als die maximal zulässige Länge für einen Indexausdruck (je nach genutzter Orderkomponente), oder?

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
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Christof »

Hallo Jimmy,

vielen Dank für Deine ausführliche Antwort. Wie immer, sehr fundiert und tiefgründig :-)

Das mit dem Index und dem Scope muss ich mir überlegen. Wird aber nicht ganz so einfach sein. An DIESER Stelle ist der Filterausdruck relativ einfach. An anderer Stelle wird der durch mehrere Checkboxes und Listboxes und SLEs erst mal vom Anwender aufgebaut und dann zusammengestellt. In der mitlaufenden CDX-Datei sind bisher schon 21 unterschiedliche Sortierungen (TAGS) enthalten, noch mehr möchte ich da eigentlich nur ungern reinbringen und nach jeder Auswahl neu zu indizieren dauert bei 40.000-200.000 Datensätzen einfach zu lange. Vielleicht werde ich das aber in einer späteren Version mal ausprobieren.

Gruß

Christof
Benutzeravatar
Christof
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 265
Registriert: Mo, 01. Okt 2007 17:14
Wohnort: Bedburg
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Christof »

Hallo Marin,

sorry, da habe ich mich falsch ausgedrückt. Die INDEXausdrücke sind nicht so lang. Das funktioniert.
Die FILTERausdrücke können manchmal ziemlich lang werden.


Gruß

Christof
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12908
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von AUGE_OHR »

Christof hat geschrieben:An anderer Stelle wird der durch mehrere Checkboxes und Listboxes und SLEs erst mal vom Anwender aufgebaut und dann zusammengestellt.
YUP ... ich "verstehe" sie Situation und auch dort gibt es eine "Lösungen" : "binäre" Filter leider nur max 2^32 also 30 "Schalter"

p.s. deine Situation "scheint" mir mit pgDBE ganz "einfach" ;)
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von UliTs »

AUGE_OHR hat geschrieben:p.s. deine Situation "scheint" mir mit pgDBE ganz "einfach" ;)
Du meinst mit SQL ;-) .

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Daniel

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Daniel »

Auch bei meinen Programmen kommt es hin &wieder vor, dass "Interne Datenstrukturen beschädigt" gemeldet werden.

Hier ein Auszug aus dem ErrorLog:

Code: Alles auswählen

    XBase Ver. 1.90.331     Windows XP -SP3
    oError: args  :  -> VALTYPE: N VALUE: 24
    oError: canDefault: N
    oError: canRetry   : N
    oError: canSubstitute: J
    oError: cargo        :  NIL
    oError: description: Interne Datenstrukturen beschädigt
    oError: gencode    :  41
    oError: operation  : set
    oError: subcode    : 5
    oError: thread      : 1
    oError: tries         : 0

    CALLSTACK:
    Aufgerufen von MAIN(345)
Die Stelle in MAIN(345) steht im RECOVER einer SEQUENCE innerhalb einer MENU-Iteration:

Code: Alles auswählen

(264) DO WHILE nMenuWahl < 8
(266) BEGIN SEQUENCE
...
(342) Close databases
(344) RECOVER
(345) set printer off    ;    set printer to
(346) set device to screen
Es handelt sich um ältere (ehemalige Clipper-) Programme, die ich in einem ersten Schritt auf XBase-Hybrid (im CRT-Fenster) umgestellt habe. Da gibt es noch 'ältere' Konstruktionen, die man heute anders macht.

"Interne Datenstrukturen beschädigt" bedeutet offenbar fehlerhafte oder fehlende Speicherinhalte. Die Ursache ist schwer zu finden. Was mir aber auffällt, dass es das zweite Mal im Bereich von "CLOSE DATABASES" auftritt. Damit hatte ich noch nie Probleme und ich kam noch nie auf die Idee, dass dieser Befehl oder "COMMIT" einen Fehler auslösen könnten.

Nun könnte man hier wie auch beim Verlassen von MAIN das SAMPLE \ALASKA\XPPW32\SOURCE\SYS\AppExit.prg verwenden (Tipp von Jimmy). Oder hat jemand eine bessere Idee, - woher der Fehler kommt? - was zu tun wäre?
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von brandelh »

Also zunächst sind "interne Datenstrukturen" Fehler, die gar nicht auftreten dürften :!:
Normale Xbase++ Befehle sollten das nicht erzeugen können (ob das so ist weiß ich nicht).

Berüchtigt sind alle API Aufrufe, wenn dabei ein Parameter vom falschen Typ übergeben wurde können interne Speicherbereiche geändert worden sein, die nicht geändert werden durften !
Leider ist natürlich weder Xbase++ noch Zusatzsoftware ganz fehlerfrei und auch Virenscanner oder Schadsoftware - genauso wie Fehler in Treibern oder Hardware können den Ablauf stören.

Das der Fehler bei COMMIT oder CLOSE DATABASES oder UNLOCK gemeldet wird, bedeutet nicht, dass er dort wirklich aufgetreten ist.
Vermutlich wurde schon einige Zeit vorher die Ursache gesetzt, aber nun werden z.B. Schreibopereationen durchgeführt und nun knallt es.

Tom hat einmal einen Ersatz für CLOSE DATABASES geschrieben, der solche Fehler reduzieren soll.
Auf jeden Fall mußt du prüfen, ob DLLCALL etc. verwendet wurde. Wenn ja Parameter prüfen.
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9362
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Tom »

Hallo, Hubert.
Also zunächst sind "interne Datenstrukturen" Fehler, die gar nicht auftreten dürften
Kein Fehler darf auftreten. Sie tun es dennoch. :wink:

Nach meiner Erfahrung sind IDSCs auch so ein bisschen die "Sammelfehler" für alles, was Alaska (bisher) im Laufzeit-Fehlersystem nicht so richtig berücksichtigt hat(te). Andreas Gehrs-Pahl hat in seiner Hilfedatei zum Fehlersystem auf einige Situationen hingewiesen, in deren Kontext IDSCs vorkommen können:

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"


Ich hatte auch schon selbst mehrfach damit zu tun, dass eine "einfache" Indexkorruption zu IDSCs geführt hat.
Herzlich,
Tom
Daniel

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Daniel »

brandelh hat geschrieben:Also zunächst sind "interne Datenstrukturen" Fehler, die gar nicht auftreten dürften :!:
Normale Xbase++ Befehle sollten das nicht erzeugen können (ob das so ist weiß ich nicht).
Das war bisher auch meine Meinung. Dann kam letzthin dieses ErrorLog: http://xbaseforum.de/viewtopic.php?f=30&t=7794#p92903
Berüchtigt sind alle API Aufrufe, wenn dabei ein Parameter vom falschen Typ übergeben wurde, können interne Speicherbereiche geändert worden sein, die nicht geändert werden durften !
API Aufrufe habe ich meines Wissens nicht. Bloss irgendwo wird noch eine Abfrage über Express gemacht.
Dass der Fehler bei COMMIT oder CLOSE DATABASES oder UNLOCK gemeldet wird, bedeutet nicht, dass er dort wirklich aufgetreten ist. Tom hat einmal einen Ersatz für CLOSE DATABASES geschrieben, der solche Fehler reduzieren soll.
Danke, den Beitrag (von 2008) habe ich gefunden: http://xbaseforum.de/viewtopic.php?f=24&t=2202&#p22871 ( - wenn du den meintest).
... prüfen, ob DLLCALL etc. verwendet wurde.
Nein.
Aber normalerweise werden in jedem Menupunkt bereits alle Dateien geschlossen, bevor man ins Hauptmenu zurückkehrt. Kann CLOSE DATABASES oder COMMIT einen Fehler verursachen, wenn schon alles geschlossen ist?
Daniel

Re: Interne Datenstrukturen beschädigt - Grund?

Beitrag von Daniel »

Tom hat geschrieben:Remarks: Also in Fatal Error Logs: "EH: 5"/"OS: 0"/"XPP: 41",
"Function: atmStartGCThread(void*)", "Module: ATM"[/i]
Danke, sind damit die obigen Angaben aus dem Errorlog gemeint: oError: gencode : 41, subcode : 5 ?
Ich hatte auch schon selbst mehrfach damit zu tun, dass eine "einfache" Indexkorruption zu IDSCs geführt hat.
Ja, stimmt, kaputter Index macht auch diesen Error.
Antworten