JCL Debug RAD2009



  • Hallo zusammen

    Ich habe die aktuelle Version von JCL Debug installiert und nach ein paar Hürden läßt es sich nun auch kompilieren.
    Habe mit dem BCB6 Wizard eine .pas Datei erstellt welche die gewünschten Informationen im Exception/AV Fall anzeigt. Unter BCB6 funktioniert dies auch.

    Wenn ich dies nun unter 2009 durchführe bekomme ich eine AV nach der anderen und zwar dann, wenn versucht wird das Dialog Fenster zu erzeugen. Da ich leider keine Delphi Kenntnisse habe komme ich hier auch nicht weiter.

    class procedure TExceptionDialog.ShowException(E: TObject; Thread: TJclDebugThread);
    begin
      if ExceptionDialog = nil then
        ExceptionDialog := ExceptionDialogClass.Create(Application);
      try
        with ExceptionDialog do
        begin
          if Assigned(Thread) then
            FThreadID := Thread.ThreadID
          else
            FThreadID := MainThreadID;
          FLastActiveControl := Screen.ActiveControl;
          if E is Exception then
            TextMemo.Text := RsErrorMessage + AdjustLineBreaks(StrEnsureSuffix('.', Exception(E).Message))
          else
            TextMemo.Text := RsErrorMessage + AdjustLineBreaks(StrEnsureSuffix('.', E.ClassName));
          UpdateTextMemoScrollbars;
          NextDetailBlock;
          //Arioch: some header for possible saving to txt-file/e-mail/clipboard/NTEvent...
          DetailsMemo.Lines.Add(Format(RsDetailsIntro, [DateTimeToStr(Now), Application.Title, Application.ExeName]));
          NextDetailBlock;
          DetailsMemo.Lines.Add(Format(RsExceptionClass, [E.ClassName]));
          if E is Exception then
            DetailsMemo.Lines.Add(Format(RsExceptionMessage, [StrEnsureSuffix('.', Exception(E).Message)]));
          if Thread = nil then
            DetailsMemo.Lines.Add(Format(RsExceptionAddr, [ExceptAddr]))
          else
            DetailsMemo.Lines.Add(Format(RsThread, [Thread.ThreadInfo]));
          NextDetailBlock;
          ShowModal;
        end;
      finally
        FreeAndNil(ExceptionDialog);
      end;
    end;
    

    In Zeile 4 wird doch versucht den Dialog zu erzeugen, jedoch ich bekomme hier eine AV.

    Kann mir hier irgendjemand weiterhelfen, bzw warum funktioniert dies unter BCB6 und 2009 nicht?

    Vielen dank im voraus.

    MfG Stephan



  • Das kann ich nicht reproduzieren. Könntest du evtl. ein Beispielprojekt irgendwo hochladen?



  • Hallo zusammen

    @audacia
    Sorry für die späte Antwort, war jedoch gestern nicht am Arbeitsplatz.
    Bin schön ein kleines Stück weiter.

    Zum Testen des Dialogs habe ich folgenden Code verwendet.

    int *test;
    *test = 123;
    

    Wenn ich diesen Code verwende, wird mir der JCL Dialog nicht angezeigt.

    Wenn der Pointer jedoch mit NULL initialisiert wird, wird der Dialog angezeigt, jedoch es werden nur Speicheradressen und keine Verweise auf die Sourcedateien bzw Zeilen angezeigt.

    int *test;
    test = NULL;
    *test = 123;
    

    Ausschnitt aus JCL Dialog

    Stack list, generated 27.03.2009 11:23:07
    (0008B302){ES5xx_Functiontest.exe} [0048C302]
    (0001AA84){ES5xx_Functiontest.exe} [0041BA84]
    (0004ACA8){ES5xx_Functiontest.exe} [0044BCA8]
    (0004D751){ES5xx_Functiontest.exe} [0044E751]
    (0004B0D1){ES5xx_Functiontest.exe} [0044C0D1]
    

    Kann hier das Projekt momentan nicht hochladen, entweder per mailen, oder ich lade es heute abend hoch.

    MfG Stephan



  • Hallo zusammen

    @audacia
    Hier wie versprochen der Link zum Download: http://www.ogv-flacht.de/ddata/JCL.zip
    Habe ein komplettes 2009er und 6.0er Projekt gezippt.

    Beim 6.0 funktioniert der Dialog in beiden Fällen wie gewünscht, beim 2009 nur beim Button2, wo der Pointer initialisiert ist.

    Das mit den fehlenden Zeilennummern im Dialog hat sich glaube ich geklärt.

    Da fällt mir noch ein, gibt es in deinem 2009er den Wizard um den JCL Dialog anzulegen?

    Vielen dank im voraus.

    MfG Stephan



  • Stephan schrieb:

    @audacia
    Hier wie versprochen der Link zum Download: http://www.ogv-flacht.de/ddata/JCL.zip
    Habe ein komplettes 2009er und 6.0er Projekt gezippt.

    Interessanter Effekt 😉
    Das Problem und insbesondere dessen Persistenz sind darauf zurückzuführen, daß die Werte uninitialisierter Stack-Variablen gewöhnlich sehr determinisiert sind. In deinem Fall zeigt i, da die Stackposition von einer zuvor aufgerufenen Funktion entsprechend verwendet wurde, recht zuverlässig auf this. Durch *i = 12; setzt du also den VMT-Zeiger deiner Instanz auf 12, was die weitere Ausführung des Programmes, wie du dir denken können wirst, empfindlich stört. Daß i bei C++Builder 6 einen anderen Wert hat, ist von subtilen Implementationsdetails abhängig und sollte von dir als reiner Zufall betrachtet werden.

    Grundsätzlich gilt: nach einem erfolgreichen Schreibzugriff auf eine unbekannte Speicherstelle ist dein Programm nicht mehr in einem wohldefinierten Zustand. Der Nullzeigerzugriff schlägt fehl, und du erhältst sofort eine Zugriffsverletzung, daher kann dein Programm danach weiterlaufen. Der andere Fall jedoch beschädigt die Struktur deines Programmes derart, daß es nicht mehr funktionsfähig ist.

    Stephan schrieb:

    Da fällt mir noch ein, gibt es in deinem 2009er den Wizard um den JCL Dialog anzulegen?

    Nur für Delphi-Projekte. Ich habe entsprechend einfach den Wizard für Delphi-Projekte benutzt und das Unit dann meinem C++Builder-Projekt hinzugefügt.



  • Hallo zusammen

    @audacia
    Vielen dank für die ausführliche Erklärung.
    Ich denke ich habe dies nun soweit verstanden.

    Warum der Wizard bei mir fehlt, ist mir nun auch klar, habe nur den Builder und kein Delphi installiert.

    MfG Stephan


Anmelden zum Antworten