Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Exception-Handling im Debugger mit DLLs
Martok - Di 19.05.09 00:15
Titel: Exception-Handling im Debugger mit DLLs
Hi!
Meine Probleme werden immer komplizierter ;)
Die Indys wwerfen bekanntermaßen bei jeder Gelegenheit mit Exceptions um sich, wenn etwas schief gehen kann. Manchmal weiß man das aber, und müsste eigentlich die Exception unterdrücken. In einer DLL mache ich deswegen das:
Delphi-Quelltext
1: 2: 3: 4: 5:
| try res.Resolve(IPAddress); except on e:EIdDnsResolverError do ; end; |
Wenn ich jetzt per definierter Host-Anwendung die DLL debugge, kommt da die Exception trotzdem noch an. Klar, dafür bin ich ja im Debugger ;)
Das Problem ist, dass eine Anwendung, die diese DLL nutzt, auch die Exception empfängt. Ist mir schleierhaft warum, schließlich geht den doch der DLL-Code gar nix an. Woher weiß also der Debugger, dass da eine Exception auftritt? Nach dem try...except sollte die doch nicht weiter gegeben werden, oder?
Ich könnte die jetzt zwar per Debugger-Setting ignorieren lassen, aber das ist mir halt nicht Granular genug, und irgendwo auch nicht ganz Sinn der Sache.
Wie werd ich diese Exception da jetzt los? Ich hab eigentlich nicht wirklich lust, mir da selber einen DNS-Resolver schrauben zu müssen.
Danke schonmal,
Sebastian
jaenicke - Di 19.05.09 00:31
Die Exception tritt eben auf, ob in einer externen DLL oder nicht, ist dabei ja egal. Denn Exceptions kommen beim Betriebssystem an und dieses sucht dann nach jemandem, der sich darum kümmert. Und das ist eben der Debugger, wenn einer aktiv ist, egal ob die Exception danach abgefangen wird oder nicht.
Und dass der Debugger die Hostanwendung debuggt und nicht direkt die DLL spielt dabei keine Rolle, denn die DLL ist von dem Programm geladen. Und damit reicht das Betriebssystem die Exception auch dann an den Debugger weiter.
Martok - Di 19.05.09 01:33
Aha, ich dachte, der Debugger hängt sich an ein Modul. Alles klar ;)
Einen "Hier gibts nichts zu sehen"-Compilerschalter gibts nicht zufällig? Dann darf ich nämlich doch einen Resolver selbst schreiben...
jaenicke - Di 19.05.09 01:50
Martok hat folgendes geschrieben : |
| Einen "Hier gibts nichts zu sehen"-Compilerschalter gibts nicht zufällig? |
Nein, Exception ist Exception, also kommt die auch zum Debugger. Was der dann damit macht, ist Sache des Debuggers.
Die Option Exceptions eines bestimmten Moduls auszuschließen, gibt es in Delphi nicht, man kann nur die Behandlung bestimmter Exceptiontypen festlegen.
Was stört das aber, dass in Delphi beim Debuggen die Exception angezeigt wird? Wenn das Programm normal läuft, passiert das ja nicht.
Martok hat folgendes geschrieben : |
| Dann darf ich nämlich doch einen Resolver selbst schreiben... |
Was genau macht denn das Ding? Einfach nur einen Domainnamen auflösen? Das geht ja auch ganz simpel mit WinSock (getaddrinfo):
http://msdn.microsoft.com/en-us/library/ms738520.aspx
Martok - Di 19.05.09 02:17
jaenicke hat folgendes geschrieben : |
| Was stört das aber, dass in Delphi beim Debuggen die Exception angezeigt wird? Wenn das Programm normal läuft, passiert das ja nicht. |
Oh doch, da die Exception eben bei jedem nicht auflösbarem DNS fliegt. Und das sind so ca 40% der verarbeiteten.
Nicht ganz. Reverse DNS mach ich, also PTR abfragen. GetHostByAddr geht deswegen nicht weil der auch im NetBIOS rumfragt, hier hab ich dann zu allem Überfluss noch ewige Timeouts. Hatte ich auch neulich nen Thread zu ;)
Was es aber gibt ist die
DNSApi [
http://msdn.microsoft.com/en-us/library/ms682016(VS.85).aspx], inklusive
Jedi-Header [
http://jedi-apilib.sourceforge.net/]-Übersetzung in der JWAPI :)
Damit erstreckt sich mein Problem auf
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| uses jwawindns var dns:PDNS_RECORD; begin if DnsQuery('85.144.99.193.in-addr.arpa',DNS_TYPE_PTR,DNS_QUERY_STANDARD,nil,@dns,nil)=0 then ShowMessage(dns^.Data.PTR.pNameHost); |
Damit werfe ich dann zwar mit APIs um mich (IPHlp und Winsock sind schon drin), aber da die ab W2k supportet sind sollte das ja keine Probleme geben.
Thread gelöst, wenn auch anders als gedacht, würd ich sagen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!