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.
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)
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
DANKE
Gruß
Christof