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.

    Code
    #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)) ); \
    }


    [font='Lucida Sans, Monaco, Geneva, sans-serif']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.


    [font='Lucida Sans, Monaco, Geneva, sans-serif']Folgendes produziert Fehler am laufenden Band:

    Code
    handlerAdress = LMemDerefHandles(OptrToHandle(oself), handlerAdressChunk);
    ....
    
    
    MessageBox(stringPtr);
    ....
    LauncherExecuteHandler(handlerAdress, ...)

    [font='Lucida Sans, Monaco, Geneva, sans-serif']Während das hier


    [font='Courier New, Courier, mono']

    Code
    ....
    MessageBox(stringPtr);
    ....
    handlerAdress = LMemDerefHandles(OptrToHandle(oself), handlerAdressChunk);
    LauncherExecuteHandler(handlerAdress, ...)

    [/font][/font][/font][/font][font='Lucida Sans, Monaco, Geneva, sans-serif'][font='Lucida Sans, Monaco, Geneva, sans-serif'][font='Lucida Sans, Monaco, Geneva, sans-serif'][font='Courier New, Courier, mono']

    [font='Lucida Sans, Monaco, Geneva, sans-serif']fehlerfrei läuft.[/font]

    [font='Lucida Sans, Monaco, Geneva, sans-serif']Offensichtlich verschiebt UserStandardDialog() den aktuellen Objekt-Block und damit ist der Pointer handlerAdress ungültig. Wer hätte das gedacht?[/font]

    [font='Lucida Sans, Monaco, Geneva, sans-serif']Gruß[/font]
    [font='Lucida Sans, Monaco, Geneva, sans-serif']Rainer[/font][/font][/font][/font][/font]

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

  • Code
    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.

  • 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.

  • 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.