Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Debuginformationen aufschlüsseln (StackBackTrace) (https://www.delphipraxis.net/142499-debuginformationen-aufschluesseln-stackbacktrace.html)

himitsu 29. Okt 2009 12:12


Debuginformationen aufschlüsseln (StackBackTrace)
 
Windows liefert ja seit XP so schöne DebugInformationen .. z.B. Dieses:
Delphi-Quellcode:
Function CaptureStackBackTrace(FramesToSkip, FramesToCapture: LongWord;
  BackTrace: Pointer; Var BackTraceHash: LongWord): Byte; StdCall;
  External 'Kernel32.dll' Name 'RtlCaptureStackBackTrace';

Procedure TForm1.FormCreate(Sender: TObject);
  Var B: Byte;
    P: Array[0..62] of Pointer;
    H: LongWord;
    i: Integer;

  Begin
    FillChar(P, SizeOf(P), 255);
    B := CaptureStackBackTrace(0, 62, @P, H);
    Edit1.Text := Format('Hash:$%8.x ', [H]);
    For i := 0 to B - 1 do Edit1.Text := Edit1.Text + Format('$%p ', [P[i]]);
  End;
Hier stehen natürlich nur die Rücksprungzeiger drinnen.
StackFrames sollten besser an sein, sonst kann es sein, daß 'ne "kleine" Funktion einfach übersehn wird.

(von vorn nach hinten: die erste Adresse ist also die Rücksprungadresse hinter den Aufruf von CaptureStackBackTrace)

Nun meine Frage:
Direkt mit Delphi ist es da doch nich möglich aus den Zeigern Funktionsnamen zu machen?
Also selbst wenn man alle möglichen delphieigenen Debuginformationen in der EXE aktiviert hat.

Der Debugger kennt sie ja, aber die wird er wohl nur aus der .DCU rausholen. :gruebel:

jaenicke 29. Okt 2009 12:23

Re: Debuginformationen aufschlüsseln (StackBackTrace)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Doch, das geht. Leider ist das ein etwas längeres Thema und ich muss gleich zur Arbeit. Mehr dazu nachher.

Deshalb nur kurz die Frage: Wie wäre es mit madExcept z.B., wenn es um die Fehleranalyse geht? Das bringt diese Funktionen doch von Hause aus mit. Siehe Anhang.

himitsu 29. Okt 2009 12:44

Re: Debuginformationen aufschlüsseln (StackBackTrace)
 
madExcept ist mir da etwas zu "mächtig" (groß), vorallem um es dauerhaft in der Anwendung zu lassen.

Ich hab ja angefangen mir 'ne eigene Exception-Klasse (Erweiterung von Exception) zu schreiben, welche halt nur noch ein paar hilfreiche Zusatzinfos mit anbieten
und die auch dauerhaft in Anwendungen drinnen bleibt.

Das Problem ist ja, daß zwar in einer Funktion der Fehler auftritt, aber dieses an irgendwelchen "inkorrekt" übergebenen Parametern irgendwo weiter vorne liegt.
Wenn diese Funktion jetzt an mehreren Stellen aufgerufen wird und man nur erfährt "hier ist ein Fehler passiert",
dann ist es nicht immer so einfach auch auf die Aufrufstelle zurückzuschließen.
Drum wäre ein StackTrace doch hilfreich.

Mir würden auch schon Zeilennummer und Unitnamen weiterhelfen (alle Funktionsnamen werden wohl schwierig sein)



Wenn passende Debuginformationen gefunden werden, dann nur würde ich gern noch die Namen wissen,
da man mit den blosen Adressen nicht immer was anfangen kann.

Aktuell hab ich diese Exception-Klasse in meinem himXML (worin sie auch entwickelt wurde) und Adressen fremder Anwendungen würden mir bei einer Fehleranalyse nicht viel helfen.

Es wäre auch schwieriger in fremde Applications einfach madAxcept einzufügen.
Drum erweitere ich NUR meine eigenen Exceptions und alle, welche davon abgeleitet sind
und in der Restlichen Application wird nichts verändert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz