Sie sind nicht angemeldet.

1

Dienstag, 3. August 2021, 12:42

Total blöder Fehler

Hallo,
hier mal wieder ein Mehrere-Stunde-Fehlersuche-Report.
Um während der Programmentwickung bestimmte Sachen anzeigen zu könne, habe ich folgedes Macro definiert. Klappt auch super.

Quellcode

1
2
3
4
5
#define MessageBox(txt) { \ 
UserStandardDialog ( (char *)0,(char *)0,(char *)0,(char *)0,txt, \
(( CDT_NOTIFICATION << CDBF_DIALOG_TYPE_OFFSET) | \
( GIT_NOTIFICATION << CDBF_INTERACTION_TYPE_OFFSET)) ); \
}



Nun hatte ich in einer Methode, der ich einen Pointer auf einen String übergebe, ständig Abstürze mit den wildesten Fehlermeldungen. Es war einfach kein System zu entdecken und manchmal ging es sogar. Ursache war letztlich der Aufruf von UserStandardDialog über obiges Macro.


Folgendes produziert Fehler am laufenden Band:

Quellcode

1
2
3
4
5
6
handlerAdress = LMemDerefHandles(OptrToHandle(oself), handlerAdressChunk);
....

MessageBox(stringPtr);
....
LauncherExecuteHandler(handlerAdress, ...)
Während das hier


Quellcode

1
2
3
4
5
....
MessageBox(stringPtr);
....
handlerAdress = LMemDerefHandles(OptrToHandle(oself), handlerAdressChunk);
LauncherExecuteHandler(handlerAdress, ...)


fehlerfrei läuft.

Offensichtlich verschiebt UserStandardDialog() den aktuellen Objekt-Block und damit ist der Pointer handlerAdress ungültig. Wer hätte das gedacht?

Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

2

Dienstag, 3. August 2021, 23:10

Vielleicht kann man den Fehler ja finden und fixen?

https://github.com/bluewaysw/pcgeos/blob…/userDialog.asm
Bye,
MeyerK

3

Dienstag, 3. August 2021, 23:40

Quellcode

1
2
3
WARNING:  This routine MAY resize LMem and/or object blocks, moving
	  them on the heap and invalidating stored segment pointers
	  to them.


Das steht im verlinkten Quelltext … klingt für mich nicht so, als sei das „mal eben so“ behebbar. :(
There are two rules in life:
1. Never give out all of the information.

4

Sonntag, 15. August 2021, 14:18

Hallo,

es hätte ja schon gereicht, wenn die Warnung in der Doku gestanden hätte. Sowohl bei UserDoDialog als auch bei UserStandardDialog.

Wenn man sich die Paramterliste von UserStandardDialog (in C) ansieht, deutet auch nichts darauf hin, dass hier gelockte Objektblöcke angefasst werden.

Mein ESP-Assembler ich leider nicht so gut, dass ich wirklich verstehe, was die Routine tut. Ich sehe auch nicht, welche Objektresource die Routine nun wirklich nutzt. Das Erzeugen des eigentlichen Dialogs scheint das Appplication-Objekt zu machen. Das klingt nicht nach "einfach mal kurz ändern".

Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

5

Samstag, 18. September 2021, 17:09

Hallo,
ich bin zu der Auffassung gelangt, dass UserStandardDialog bzw. UserStandardDialogOptr höchstwahrscheinlich (!) eine DialogBox im Objektblock des Application-Objekts erzeugt. In R-BASIC gibt es hunderte von UserStandardDialog-Aufrufen, die alle problemlos funktionieren und bei denen auch der pself-Debugging-Code nicht anschlägt - mit Ausnahme der oben genannten in einer Application-Object-Message.

Für mich ist die Konsequenz, dass ich Aufrufe von UserStandardDialog~() in Messageshandlern des Application-Objekts (und Objekten, die in der gleichen Resource liegen) entweder vermeide oder zumindest hinterher pself dereferenziere (pself = ObjDerefGen(oself);).
Gruß
Rainer
Es gibt 10 Arten von Menschen - die einen wissen was binär ist, die anderen nicht.

Zur Zeit ist neben Ihnen 1 Benutzer in diesem Thema unterwegs:

1 Besucher

Ähnliche Themen

Thema bewerten