Laufzeitfehler abhängig von 32 oder 64 Bit?

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Laufzeitfehler abhängig von 32 oder 64 Bit?

Beitrag von Jan »

Ich hatte hier ja schon einige Male über merkwürdige Probleme berichtet. Das z. B. ein DbRUnLock() zu einem Laufzeitfehler führt. Ich habe auch das Problem, das ich eine FOR...NEXT-Schleife habe, die in der Schleife mehrfach auf ein durch den Zähler bestimtmes Arrayelement zugreift, und dann plötzlich mit einem Laufzeitfehler aussteigt, weil der Zähler zu hoch für die Anzahl der Arrayelemente ist. Obwohl der Zähler laut FOR...NEXT garnicht so hoch sein darf wie die Fehlermeldung ausgibt, und obwohl vorher bereits einige Zeilen in der Schleife mit genau dem Wert sauber auf exakt dem gleichen Array durchgelaufen sind, erst in der vierten oder fünften Zeile soll der Wert plötzlich zu hoch sein. Das empfinde ich extrem verwirrend.

Jetzt hat ein Kunde eine interessante Variante ins Spiel gebracht. Ich bitte meine Kunden, mir im Fehlerfall das Fehlerprotokoll per automatischer Mail (dazu benutze ich blat) zukommen zu lassen. Das Protokoll habe ich etwas aufgebretzelt, damit ich ein paar mehr Infos bekomme, wie die Lizenzdaten und die Dateiversionen. Ich konnte den Kunden also eindeutig indentifizieren und habe mich mit ihm in Verbindung gesetzt. Und er sagte mir etwas sehr Merkwürdiges: Das Programm läuft bei ihm einwandfrei auf dem PC. Der Windows 7 64 hat. Auf dem Laptop dagegen mit Windows 7 32 gibt es die gemeldeten Probleme mit den zu hohen Array-Zugriffen.

Meine Rechner sind alle Windows 7 oder 8.1 mit 64 Bit, wobei die ausgelieferten Programme immer auf dem Windows 7-Rechner erstellt wurden. Kann es sein, das es bei auf 64Bit-Systemen kompilierten Pogrammen auf 32Bit-Systemen zu Problemen kommen kann? Ich kann das ansich überhaupt nicht glauben.

Um das etwas mehr zu verifizieren: Wie bekomme ich in meine Fehlermails rein, welche Variante von Windows der Kunde benutzt - 32 oder 64 Bit? Dann könnte ich das bei weiteren Fehlermails mal beobachten, ob das wirklich immer an der Bit-Version liegt.

Die Programme sind noch alle mit 1.9 SL1 erstellt.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Laufzeitfehler abhängig von 32 oder 64 Bit?

Beitrag von brandelh »

Jan hat geschrieben:Kann es sein, das es bei auf 64Bit-Systemen kompilierten Pogrammen auf 32Bit-Systemen zu Problemen kommen kann? Ich kann das ansich überhaupt nicht glauben.
Das kann eigentlich auch gar nicht sein, denn Xbase++ nutz egal auf welchem Rechner immer die 32 bit Befehle und die EXE sind (müssten es sein ich habe noch nicht getestet) auf allen PCs identisch.
Was unterschiedlich ist, sind die Resourcen !
Ein Windows 32 bit kann etwas 3,5 GB RAM verwalten, damit muss das OS und alle anderen Programme auskommen.
Oft sind in solchen Rechnern nur 2 oder 3 GByte RAM verbaut.
Ein 64 Bit Windows mit 4 GB Ram im Rechner ist kaum besser, wobei eher schlechter dran.
Allerdings dürften einigermaßen aktuelle Rechner häufig 8 GB oder mehr haben ... dann hat ein 32bit Programm auf jeden Fall 3,5 GB für sich allein.

Eventuell verhält sich die RunTime von Xbase++ unterschiedlich wenn MEHR RAM zur Verfügung steht.
Ich behaupte es aber nicht, weil wissen kann es nur Alaska und wir sollen ja nichts behaupten :badgrin:

Es könnte aber auch sein, dass ein Treiber oder sonstiges auf dem Laptop sich anders verhält und es deshalb zu Problemen führt.
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Laufzeitfehler abhängig von 32 oder 64 Bit?

Beitrag von Jan »

Nach den Hinweisen des Kunden habe ich eine mögliche Schwachstelle gefunden. Und ihm eine neue dll geschickt, mal sehen ob es das war. Aber es ist dennoch irritierend, daß das Programm sich da unterschiedlich verhält auf den beiden verschiedenen Rechnern. Ich weiß ja nicht, ob es wirklich der 32/64Bit-Unterschied ist, der Kunde hat mir halt nur als Unterschied zwischen den beiden Rechnern das und den Unterschied PC/Laptop genannt. Könnte also wie Du auch zur Diskussion gestellt hast irgendein Treiber oder sowas sein. Das sich aber hochgezählte Variablen für einen Arrayzugriff unterschiedlich verhalten erschließt sich mir dennoch nicht. Was haben Treiber oder Bitzahl da für einen Einfluß drauf???

Bleibt noch die Frage: Wie bekomme ich die Angabe, ob 32 oder 64, in mein Fehlerprotokoll rein?

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

Re: Laufzeitfehler abhängig von 32 oder 64 Bit?

Beitrag von AUGE_OHR »

Jan hat geschrieben:Bleibt noch die Frage: Wie bekomme ich die Angabe, ob 32 oder 64, in mein Fehlerprotokoll rein?
wenn du ein C:\WINDOWS\SYSWOW64 Verzeichnis hast ist es 64bit
gruss by OHR
Jimmy
DelUser01

Re: Laufzeitfehler abhängig von 32 oder 64 Bit?

Beitrag von DelUser01 »

Hallo Jan

Sollte Dir helfen:

Code: Alles auswählen

// Prüfen ob 32bit oder 64bit Betriebssystem
Function GsSysIs64Bit
Static lIs64Bit := NIL
If lIs64Bit == NIL
   lIs64Bit := ( Len( Directory( "c:\windows\syswow64" , "DSH" ) ) >= 1 )
EndIf
Return( lIs64Bit )

Code: Alles auswählen

#Include "os.ch"
// Prüfen ob Windows 7 Betriebssystem
Function GsSysIsWin7
Static lIsWin7 := NIL
If lIsWin7 == NIL
   lIsWin7 := ( Upper( Os( OS_PRODUCT  ) ) == "WIN7"      .Or. ;
                Upper( Os( OS_FULLNAME ) ) == "WINDOWS 7" .Or. ;
                Upper( Left( Os() , 9  ) ) == "WINDOWS 7" )
EndIf
Return( lIsWin7 )

Code: Alles auswählen

#Include "os.ch"
// Prüfen ob Windows 8 Betriebssystem
Function GsSysIsWin8
Static lIsWin8 := NIL
If lIsWin8 == NIL
   lIsWin8 := ( Upper( Os( OS_PRODUCT  ) ) == "WIN8"      .Or. ;
                Upper( Os( OS_FULLNAME ) ) == "WINDOWS 8" .Or. ;
                Upper( Left( Os() , 9  ) ) == "WINDOWS 8" )
EndIf
Return( lIsWin8 )
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Laufzeitfehler abhängig von 32 oder 64 Bit?

Beitrag von AUGE_OHR »

Jan hat geschrieben:... Arrayelement zugreift

Auf dem Laptop dagegen mit Windows 7 32 gibt es die gemeldeten Probleme mit den zu hohen Array-Zugriffen.
von welcher grösse des Array sprechen wir ?
du hattest doch mal einen "Hotfix" für sehr grosse Arrays ... ist der dabei im Spiel ?
gruss by OHR
Jimmy
Antworten