![]() |
Exception-Handling: verursachende Function/Procedufe finden?
Hallo,
gibt es eine Möglichkeit, in meiner selbstgeschriebenen OnException Procedure mit Bordmitteln (WinAPI oder Object-Pascal) herauszubekommen, welche Function oder Procedure die Exception verursacht hat? Externe Komponenten wie z.B. MadExcept möchte ich nur ungern einsetzen. Gruß |
Re: Exception-Handling: verursachende Function/Procedufe fin
Also zuerst brauchst Du eine entspr. Funktion um die Exceptions verarbeiten zu können, dafür haben die Schweizer ein Grundgerüst:
![]() Ich würde mir jetzt eine globale Variable anlegen, welcher ich in jeder Funktion bzw. auch an relevanten Codeabschnitten einen anderen Wert gebe. Den Ihnalt dieser Variablen kann man dann bei einem Fehler mit ausgeben und hat dann wenigstens eine Anhaltspunkt wo der Fehler liegen könnte :???: |
Re: Exception-Handling: verursachende Function/Procedufe fin
Hallo,
das Grundgerüst steht schon lange ;) Dein Lösungsvorschlag mit der globalen Variable ist bei einer bestehenden Anwedung mit ca 730.000 Zeilen Code wenig praktikabel. Gruß |
Re: Exception-Handling: verursachende Function/Procedufe fin
Zitat:
Ich mach das in einem Programm so:
Delphi-Quellcode:
procedure TMyProg.AppException(Sender: TObject; E: Exception);
var MyError: TStringList; Comp, Tmp1, Tmp2: string; begin MyError := nil; try MyError := TStringlist.Create; if FileExists(ChangeFileExt(ParamStr(0), '.err')) = True then begin MyError.LoadFromFile(ChangeFileExt(ParamStr(0), '.err')); MyError.Add(''); MyError.Add(''); end; Tmp2 := 'Exception from '; Tmp1 := ''; while Length(Tmp1) < Length(Tmp2) do Tmp1 := Tmp1 + '-'; Tmp1 := Tmp1 + '-------------------'; MyError.Add(Tmp1); MyError.Add(Tmp2 + FormatDateTime('mm"/"dd"/"yyyy hh":"nn":"ss', Now)); MyError.Add(Tmp1); MyError.Add(''); //Meldung formatieren... Comp := Trim(Sender.ClassName); if Comp = '' then Comp := 'Application'; try Comp := Comp + '[' + TControl(Sender).Name + ']'; except try Comp := Comp + '[!!! ' + E.Message + ']'; except end; end; Comp := Comp + ': "' + E.Message; while pos(#13, Comp) > 0 do Comp := copy(Comp, 1, pos(#13, Comp) - 1) + ' ' + Copy(Comp, pos(#13, Comp) + 1, Length(Comp)); Comp := Trim(Comp) + '"'; if IsEncStarting = True then begin Comp := Comp + #13#13 + GetResTxt(LangDll, 83); end; MyError.Add(Comp); //Begrenzung while MyError.Count > 2000 do MyError.Delete(0); while (MyError.Count > 0) and (copy(MyError[0], 1, 1) <> '-') do MyError.Delete(0); MyError.SaveToFile(ChangeFileExt(ParamStr(0), '.err')); finally MyError.Free; end; if (pos('closed gracefully', LowerCase(E.Message)) = 0) and (pos('read time', LowerCase(E.Message)) = 0) and (IsClosing = False) and (IsEP = False) then MessageDlg(E.Message, mtError, [mbOK], 0); EncError := True; IsEP := False; end; |
Re: Exception-Handling: verursachende Function/Procedufe fin
Du kannst natürlich auch den Stack durchforsten (Analyse CALL, JNE usw.). Das ist aber kompliziert, gefährlich und ohne ein Mapfile und Debug-Infos auch kaum hilfreich. Solltest Du diese Funktionalität wirklich des öfteren benötigen, solltest Du vielleicht doch die Möglichkeit des Einsatzes einer externen Komponente zum Exception-Tracking in Betracht ziehen.
|
Re: Exception-Handling: verursachende Function/Procedufe fin
Okay, danke für die Infos. Ich werd mir das mit der externen Komponente noch mal durch den Kopf gehen lassen.
Gruß |
Re: Exception-Handling: verursachende Function/Procedufe fin
Die Jedis haben hier auch schon viel gemacht, was sehr tauglich ist.
Ich habe auch (ist aber schon ne weile her) auch immer den gesamten Stack noch mit rausgetraced. Wenn noch ein passendes Map-File mit dabei war und die Debug Infos verfügbar waren habe ich diese Daten auch noch mit ausgegeben so dass der Stack halt auch Funktionen und nicht nur Adressen ausgegeben hat. Die Sache war aber eben folgende: Trat ein Fehler reproduzierbar auf habe ich beim Kunden immer die zum release passende Debug-Echse mit Mapfile rausgekramt, ausgetauscht und hatte dann recht verläßliche Daten. |
Re: Exception-Handling: verursachende Function/Procedufe fin
Es gibt eigentlich nur drei Produkte.
1. Die JCL mit der JCL Debug Extension. Frei unter der MPL, aber nicht so weit gehend wie die anderen Produkte. 2. Madshi mit madExcept ![]() 3. Eurekalog ![]() Soweit ich das mitkriege liefern sich Madshi und Eurekalog einen freundschaftlichen Wettbewerb wer denn die besseren Features hat. Gerade sind madExcept 3.0a und Eurekalog 5.0.6 erschienen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz