AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Exception-Handling: verursachende Function/Procedufe finden?
Thema durchsuchen
Ansicht
Themen-Optionen

Exception-Handling: verursachende Function/Procedufe finden?

Ein Thema von HeikoAdams · begonnen am 1. Dez 2005 · letzter Beitrag vom 1. Dez 2005
Antwort Antwort
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#1

Exception-Handling: verursachende Function/Procedufe finden?

  Alt 1. Dez 2005, 08:59
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ß
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#2

Re: Exception-Handling: verursachende Function/Procedufe fin

  Alt 1. Dez 2005, 09:11
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
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#3

Re: Exception-Handling: verursachende Function/Procedufe fin

  Alt 1. Dez 2005, 09:20
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ß
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Benutzerbild von FriFra
FriFra

Registriert seit: 19. Apr 2003
1.291 Beiträge
 
Delphi 2005 Professional
 
#4

Re: Exception-Handling: verursachende Function/Procedufe fin

  Alt 1. Dez 2005, 09:29
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;
Elektronische Bauelemente funktionieren mit Rauch. Kommt der Rauch raus, geht das Bauteil nicht mehr.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Exception-Handling: verursachende Function/Procedufe fin

  Alt 1. Dez 2005, 09:58
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.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von HeikoAdams
HeikoAdams

Registriert seit: 12. Jul 2004
Ort: Oberfranken
661 Beiträge
 
FreePascal / Lazarus
 
#6

Re: Exception-Handling: verursachende Function/Procedufe fin

  Alt 1. Dez 2005, 10:02
Okay, danke für die Infos. Ich werd mir das mit der externen Komponente noch mal durch den Kopf gehen lassen.

Gruß
Jeder kann ein Held werden und Leben retten!
Einfach beim NKR oder der DKMS als Stammzellenspender registrieren! Also: worauf wartest Du noch?
  Mit Zitat antworten Zitat
Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#7

Re: Exception-Handling: verursachende Function/Procedufe fin

  Alt 1. Dez 2005, 10:11
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.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#8

Re: Exception-Handling: verursachende Function/Procedufe fin

  Alt 1. Dez 2005, 10:38
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:35 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