AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Exception-Logging für ungefangene Exceptions aus DLLs

Exception-Logging für ungefangene Exceptions aus DLLs

Ein Thema von Der schöne Günther · begonnen am 7. Aug 2015 · letzter Beitrag vom 10. Aug 2015
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
5.932 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Exception-Logging für ungefangene Exceptions aus DLLs

  Alt 7. Aug 2015, 17:51
Ein altes Delphi-Projekt schluckt viele Exceptions oder lässt sie auf die VCL durchbubbeln. Es soll nun so erweitert werden, dass diese Exceptions mit Callstack in eine Textdatei gelogged werden sollen.

Bis hierhin noch einfach. Jetzt das Problem: Das Projekt benutzt viele DLLs die ebenfalls in Delphi erstellt wurden. Es ist nicht garantiert dass alle von den DLLs exportierten Methoden keine Exceptions werfen. Die Aufruf-Direktive ist durchgehend stdcall .

Meine Frage: Ich kann für Exceptions aus der Anwendung ja einfach die Variable Exception.GetExceptionStackInfoProc auf eine Prozedur setzen die mir den Stacktrace ausliest (z.B. mit der JCL). Bei einer Exception direkt aus einer DLL wird das nie aufgerufen. Warum nicht? Was kann ich tun?

Ich habe keine Hoffnung, an den Stack aus der DLL zu kommen. Aber wenigstens die Stelle aus der Hauptanwendung werde ich doch wissen können?

Ich bin ganz ehrlich, mir fehlt das Lowlevel-Wissen, was da intern passiert. Ohne wirklich zu verstehen was da vor sich geht probierte ich mal mit der Aufruf-Direktive safecall . Hier wird Exception.GetExceptionStackInfoProc wieder ganz normal aufgerufen, aber Delphi scheint das ganze irgendwie komisch zu wrappen und wirft am Schluss lieber eine dumme OleException welche die eigentliche Exception nicht mehr beinhaltet.

Auf die Idee kam ich nur da Wikipedia spricht:
Zitat:
The safecall calling convention is the same as the stdcall calling convention, except that exceptions are passed back to the caller in EAX as a HResult (instead of in FS:[0]), [...]
Kann ich Hoffnung haben, in meinem Hauptprogramm einfach überall stdcall durch safecall zu ersetzen? Mann, sind das wilde Gedanken.

i-have-no-idea-what-im-doing-dog.jpg
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.428 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Exception-Logging für ungefangene Exceptions aus DLLs

  Alt 7. Aug 2015, 18:57
Ich habe keine Hoffnung, an den Stack aus der DLL zu kommen. Aber wenigstens die Stelle aus der Hauptanwendung werde ich doch wissen können?
Wir benutzen dafür Eurekalog. Sofern du auch die DLL mit Eurekalog und damit mit den nötigen Debuginformationen kompilierst, bekommst du auch den Stacktrace inkl. der Methoden, die in der DLL liegen. (Auch wenn es eigentlich keine gute Idee ist, dass Exceptions nicht alle in der DLL abgefangen werden...)
MadExcept sollte genauso funktionieren.

Bei Eurekalog sieht dass dann so aus:

eurekalogdll.png

Mehr Informationen hier:
https://www.eurekalog.com/help/eurek...ex.php?dll.php

Du kannst auch Standard-Debuginfos in Form von .dbg Dateien mitliefern, dann können sogar externe Tools wie der Process Explorer oder das Windows-Fehlerbehandlungstool problemlos Stacktraces erstellen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Exception-Logging für ungefangene Exceptions aus DLLs

  Alt 8. Aug 2015, 01:12
Sind die DLLs von dir?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von frankyboy1974
frankyboy1974

Registriert seit: 7. Apr 2015
Ort: SH
169 Beiträge
 
Delphi XE7 Professional
 
#4

AW: Exception-Logging für ungefangene Exceptions aus DLLs

  Alt 8. Aug 2015, 12:01
Hallo,

vielleicht verstehe ich hier etwas nicht richtig, aber dennoch: Du rufst eine Funktion einer DLL auf, diese Prozedur ruft ihrerseits ggf. eine andere Funktion auf (und so weiter und so fort), irgendwo tritt jetzt ein Fehler auf, was würde dir jetzt ein StackTrace bringen????
Du weisst also, dass in der DLL beim Aufruf der Funktion "Wieauchimmerichheisse" ein Fehler auftritt (wobei natürlich ohne der Debug-Informationen, der Name grundsätlich hier nicht mehr steht), was bringt dies dass jetzt weiter.
Wie du in deiner eigenen Anwendung die Frage beantworten könntest
Zitat:
Aber wenigstens die Stelle aus der Hauptanwendung werde ich doch wissen können?
.

Delphi-Quellcode:
try

dll.tuewas
except
log.fehlerwarbeituewas
end
mfg

frank
Java ist auch eine Insel.
Ist Delphi von Oracle?
In meiner Buchstabensuppen fehlt das C++!
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.428 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Exception-Logging für ungefangene Exceptions aus DLLs

  Alt 8. Aug 2015, 19:33
Was aber ein deutlich höherer Aufwand ist als einfach EurekaLog oder MadExcept einzubinden und gar nichts weiter im Code zu ändern...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.932 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Exception-Logging für ungefangene Exceptions aus DLLs

  Alt 10. Aug 2015, 08:38
Hallo-

Danke für die Antworten bislang. Eurekalog, madExcept und Konsorten kommen leider nicht in Frage: Es soll nichts kosten. Die JCL erfüllt das Kriterium. Etwas anderes kenne ich nicht.

Ich glaube, alle DLLs die Exceptions werfen KÖNNTEN sind Borland DLLs, also Delphi und C++ Builder. Und ich meine, zu allen liegt der Source vor. Anpassen würde ich das aber gerne NICHT.

Blöd, grade so etwas wie auf deinem "EurekaLog"-Bild würde ich gerne haben. Ich kenne mich hier nicht aus, würde es einen Unterschied machen, ob die DLL statisch oder dynamisch eingeladen wird?
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.428 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Exception-Logging für ungefangene Exceptions aus DLLs

  Alt 10. Aug 2015, 10:14
Eurekalog, madExcept und Konsorten kommen leider nicht in Frage: Es soll nichts kosten.
madExcept ist kostenlos für nicht kommerzielle Nutzung.

würde es einen Unterschied machen, ob die DLL statisch oder dynamisch eingeladen wird?
Nein
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
5.932 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Exception-Logging für ungefangene Exceptions aus DLLs

  Alt 10. Aug 2015, 12:26
madExcept ist kostenlos für nicht kommerzielle Nutzung.
Ich weiß, das ist aber kein Hobby-Projekt


Die JCL hat auch ein Demo dabei wo er auch genau kann, was Eurekalog da macht. Der Code ist aber für mein Gehirn zu verworren um ihn überhaupt extrahieren zu können. Deshalb nehme ich, wenn meineException.StackTrace leer ist (also der Automatismus nicht gegriffen hat), einfach den normalen Stacktrace (in einem ominösen "raw mode"). Das sieht dann ungefähr so aus:

Code:
Sender: TForm2
Exception: EProgrammerNotFound: 'The programmer has gone home'
[006107D9] Debug.StackTracer.TStacktracerJCL.getStack (Line 80, "Debug.StackTracer.pas")
[00610E4E] NewExceptionHandlingProject.TExceptionHandler.ObtainStackTrace (Line 145, "NewExceptionHandlingProject.dpr")
[00610C6C] NewExceptionHandlingProject.TExceptionHandler.HandleException (Line 121, "NewExceptionHandlingProject.dpr")
[005DB672] Vcl.Forms.TApplication.HandleException
[0052DDDF] Vcl.Controls.TWinControl.MainWndProc
[004084B3] System.TMonitor.Exit
[0052DDA4] Vcl.Controls.TWinControl.MainWndProc
[006104C0] Unit2.TForm2.Button2Click (Line 116, "Unit2.pas")
(ca 50 weitere Zeilen)
Ich glaube für meine Zwecke soll das reichen
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
8.428 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Exception-Logging für ungefangene Exceptions aus DLLs

  Alt 10. Aug 2015, 13:21
Ich weiß, das ist aber kein Hobby-Projekt
Dann dürfte es mehr kosten auf diese Tools zu verzichten als die Tools kosten, einerseits wegen des Aufwands das Exceptionhandling einzubauen, andererseits aufgrund der vermutlich schlechteren Ergebnisse.

Aber das musst du natürlich bezogen auf das Projekt selbst beurteilen...
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 19:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf