[Delphi] Wie finde ich heraus, wer einen Zugriffsverletzungsfehler verursacht?


Answers

Ich würde eine Art Exception-Hook empfehlen , wie Eurekalog oder madExcept , die Ihnen einen netten Callstack gibt, wenn Ausnahmen auftreten.

Jetzt hilft dir das jetzt sehr, natürlich ...

Ich hatte kein Glück mit dem Dialog 'Fehler finden'. Generell ist ein konsequenter Fehlerfall und eine Menge Stepping die einzige / schnellste / einfachste Lösung. Wenn es sich um einen nicht initialisierten Zeiger oder ein freigegebenes Objekt handelt, kann Ihnen FastMM4 mit den richtigen Einstellungen helfen.

Question

Ich erhalte Berichte, dass meine App auf einigen Vista-Computern eine GPF verursacht. Die Fehlermeldung lautet etwa so:

Zugriffsverletzung bei 0x75784062 (versucht, auf 0x00000006 zu schreiben)

Um dies zu beheben, muss ich zuerst genau wissen, wer dieses GPF verursacht: meine Haupt-EXE, eine Drittanbieter-Komponente, eine meiner eigenen ActiveX-Komponenten, eine DLL usw.

Wie kann ich das herausfinden? Welche Werkzeuge können das genaue Modul bestimmen, das dieses Durcheinander verursacht hat?

Jede Hilfe würde sehr geschätzt werden.

PS Meine App ist in VB6 codiert und meine ActiveX-Steuerelemente sind in Delphi 2007 geschrieben.




Das Aufspüren von AVs kann schwierig sein, weil der wahre Grund möglicherweise nicht an dem Punkt liegt, an dem die Ausnahme tatsächlich auftritt. Einige allgemeine Tipps:

  1. Schau dir die Adresse an. DLLs (einschließlich ActiveX / OCX) werden bei höheren Adressen geladen, normalerweise jenseits von 0x50000000 (Systemm DLLs sind normalerweise in 0x70000000 bis 0x78000000). Es sieht aus, als ob dein AV in einer DLL passiert. Denken Sie daran, dass in der neuesten Version der Windows-Adressraum-Randomisierung die Adressen für jeden Lauf geändert werden können
  2. Ein Call-Stack ist sehr nützlich, um zu verstehen, wie der Code zum AV gelangt ist. Neben EurekaLog und MadExcept benötigen die JCL / JVCL-Bibliotheken diese Informationen. Möglicherweise müssen Sie mit mehr Debugging-Informationen (und Kartendateien) kompilieren, um einen nützlichen Aufruf-Stack zu erhalten.
  3. Delphi hat eine Debugging-Funktion für das Goto-Address, die es ermöglicht, eine Anwendung zu laden, sie im Debugger anzuhalten und dann zu einer Adresse zu springen. Aber es erfordert, dass sich die Adresse währenddessen nicht geändert hat (das Neukompilieren mit der Änderung wird wahrscheinlich die Adresse ändern, und die Randomisierung wird ebenfalls funktionieren).
  4. Wenn der Fehler nicht auf Ihrem Entwicklungscomputer repliziert werden kann, können Sie versuchen, den Remotedebugger zu debuggen, um eine Anwendung zu debuggen, die auf einem anderen Computer ausgeführt wird.



Installieren Sie Debug Diag und überwachen Sie Ihre App, er generiert DUMP-Datei für Sie und muss analysieren.