Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Exception-Handling: verursachende Function/Procedufe finden? (https://www.delphipraxis.net/58086-exception-handling-verursachende-function-procedufe-finden.html)

HeikoAdams 1. Dez 2005 08:59


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ß

FriFra 1. Dez 2005 09:11

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: http://www.swissdelphicenter.ch/de/showcode.php?id=819

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 :???:

HeikoAdams 1. Dez 2005 09:20

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ß

FriFra 1. Dez 2005 09:29

Re: Exception-Handling: verursachende Function/Procedufe fin
 
Zitat:

Zitat von HeikoAdams
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ß

Du kannst natürlich über den Sender der Exception die "auslösende" Komponente inkl. Name etc. auslesen und mit ausgeben, aber das ist sehhhr ungenau. Wenn Du auch nur eine ungefähre Vorstellung hast, woher der Fehler kommen könnte, dann sind mit Sicherheit nur wenige hundert Zeilen betroffen ;)

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;

Union 1. Dez 2005 09:58

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.

HeikoAdams 1. Dez 2005 10:02

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ß

Phoenix 1. Dez 2005 10:11

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.

Robert Marquardt 1. Dez 2005 10:38

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 http://www.madshi.net
3. Eurekalog http://www.eurekalog.com

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 09:42 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