Programm stürzt mit 0xC000000D und keine Ausnahmen - wie kann ich das Debuggen?
Ich habe ein Visual C++ 9 Win32-Anwendung verwendet eine third-party Bibliothek. Wenn eine Funktion aus dieser Bibliothek aufgerufen wird, mit einem bestimmten Satz von Parametern das Programm stürzt mit "Ausnahmecode 0xC000000D".
Ich versuchte, fügen Sie Visual Studio-debugger - keine Ausnahmen geworfen werden (weder C++ noch strukturiert wie Zugriffsverletzungen) und terminate()
ist nicht genannt. Trotzdem das Programm einfach endet still.
Wie geschieht es, dass das Programm abnormal beendet wird, aber ohne zu stoppen, im debugger? Wie kann ich die lokalisieren das problem?
ist es multithreaded oder Singlethreaded?
Ein worker-thread, mehrere service-threads erzeugt, die von RPC. Wir testeten die Synchronisierung gründlich, multithreading ist unwahrscheinlich, dass das problem.
Sind Sie eine release version oder debug version ist? Ich habe gesehen, seltsame Fälle von release-Versionen nicht zu stoppen, im debugger.
Osherov: Beide Versionen die gleiche Weise Verhalten in dieser situation.
Viele gute Gedanken - alle diese gefangen werden, von WinDbg und du wirst genau wissen, was passiert ist. Ein weiterer Weg, um fangen alle diese Fehler wird durch die Verwendung von AppVerifier - keine Notwendigkeit zu zahlen für BoundsChecker.
Ein worker-thread, mehrere service-threads erzeugt, die von RPC. Wir testeten die Synchronisierung gründlich, multithreading ist unwahrscheinlich, dass das problem.
Sind Sie eine release version oder debug version ist? Ich habe gesehen, seltsame Fälle von release-Versionen nicht zu stoppen, im debugger.
Osherov: Beide Versionen die gleiche Weise Verhalten in dieser situation.
Viele gute Gedanken - alle diese gefangen werden, von WinDbg und du wirst genau wissen, was passiert ist. Ein weiterer Weg, um fangen alle diese Fehler wird durch die Verwendung von AppVerifier - keine Notwendigkeit zu zahlen für BoundsChecker.
InformationsquelleAutor sharptooth | 2010-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dass STATUS_INVALID_PARAMETER, verwenden Sie WinDbg auf die Spur, wer warf ihn (D. H. befestigen Sie WinDbg,
sxe eh
danng
.Auf der Suche rund um, scheint zu zeigen, dass es Funktionen sind, die werfen das - aber auch, dass es Funktionen, die die Nutzung STATUS_INVALID_PARAMETER als einen Wert zurück. Also vielleicht nichts geworfen wird, nachdem alle ...
VS ausblenden von bestimmten Arten von Ausnahmen, die es nicht wissen, wie man mit (selten). Mit WinDbg 100% Regeln, jede Art von Ausnahme.
Ich werde versuchen, diese, wenn wir nicht Holen Sie sich Hilfe von der Bibliothek Verkäufer. Ich fand auch diese viel versprechende KB-Artikel auf, wie zu verwenden WinDbg in solchen Fällen: support.microsoft.com/kb/313109/en-gb
InformationsquelleAutor Paul Betts
Anderen Antworten und Kommentare auf die Frage hat mir sehr geholfen. Hier ist, was ich Tat.
Ich bemerkt, dass wenn ich das Programm unter Visual Studio-debugger, es endet nur leise, aber wenn ich es ausführen ohne debugger stürzt er ab mit einer Meldung, die box (übliche Windows-message-box zu sagen, dass ich verlor meine nicht gespeicherten Daten und jeder ist sooo sorry).
Also begann ich das Programm ohne debugger, lass es Abstürzen und dann - während der message-box war immer noch da - anbei der debugger, und drücken Sie "Pause". Hier ist der Aufruf-stack:
so offensichtlich, dass ein problem innerhalb der trird-party-Bibliothek. Laut MSDN,
UnhandledExceptionFilter()
genannt wird in tödliche Situationen und klar der Aufruf erfolgt ist, weil ein problem in den library-code. So werden wir versuchen, das problem zu Bearbeiten, mit der Bibliothek Anbieter erste.InformationsquelleAutor sharptooth
Wenn du nicht den Quellcode und debug-Informationen für Ihre 3rd-party-Bibliothek, die Sie nicht in der Lage sein, um den Schritt in es mit dem debugger. Wie ich es sehe, Ihre Entscheidungen sind;
Sehr schwer zu beheben-code, als Objekt nur
Bearbeiten Sie vielleicht auch in der Lage sein zu beenden, mit mehr Anmut, mit __try __endlich um Ihre wichtigste Botschaft Schleife, so etwas wie
sicher, aber nur in assembler, ohne die PDB. Mit der PDB aber keine Quelle, Sie bekommen schön kommentieren assmebler mit labels aus der Quelle. IMO sind diese selten Wert hand Debuggen, als ein fix erledigt werden müssen, in assembler, welche zeitaufwendig und verursachen eine zukünftige Wartungs-Albtraum.
Ich glaube nicht, dass OP ' s problem war ein Schritt in den code, sondern eher die Erfassung der Ausnahme, die er sagt, nicht passieren.
Aber er will nicht von hand Debuggen der Versammlung, will er eine call-stack (auch eine falsche), die die Fehler zeigen. Wenn der Fehler tatsächlich ausgelöst wird, durch den OS, er wird haben Symbole für die
InformationsquelleAutor SmacL