Frage

Seltsames Programm hängen, was das im Debug bedeutet?

Nach dem Anbringen windbg fand ich folgendes:

(1714.258): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=015b5c74 ebx=178a13e0 ecx=dddddddd edx=009a8ca0 esi=09fbf698 edi=09fbf594
eip=005ae2f7 esp=09fbf4a4 ebp=09fbf594 iopl=0         nv up ei ng nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010286
TestApplication!std::_Container_base::_Orphan_all+0x57:
005ae2f7 c70100000000    mov     dword ptr [ecx],0    ds:0023:dddddddd=????????

Anruf Stack:

TestApplication!std::_Container_base::_Orphan_all+0x57
TestApplication!std::vector >::operator=+0x37
TestApplication!boost::asio::detail::win_iocp_io_service::do_one+0x189
TestApplication!boost::asio::detail::win_iocp_io_service::run+0xa2
TestApplication!boost::asio::io_service::run+0x3a
War es hilfreich?

Lösung

Das Problem

  1. Erste Chance Ausnahmen bedeuten, dass der Debugger, geben wird, die Person, die den Debugger verwendet, die erste Chance, die Ausnahme zu debuggen, bevor er es wieder auf dem Programm wirft das Problem zu behandeln.

  2. In diesem Fall wird die Ausnahme "Zugriffsverletzung" ist. Das bedeutet, dass Ihr Programm versucht, von einem illegalen Speicherplatz zu lesen / schreiben.

  3. Zugriffsverletzungen sind ernst Coz es einige Speicher könnte korrumpieren, die für Ihr Programm kritisch und dies wäre der wahrscheinlichste Grund sein, dass Ihr Programm hängt.

  4. Von der fehlerhaften Anweisung scheint es, als ob Sie den Inhalt eines 4-Byte-Wert aus einer illegalen Instruktion zu bekommen versuchen.

Testen das Problem

  1. Wenn dies Ihr Code ist, dann können Sie leicht dieses Problem zu debuggen, indem Sie die Debug-Symbol Lage in den Ausgabeordner Ihrer Compiler-Einstellung (dies würde die entsprechenden PDB-Dateien enthalten)

  2. Wenn Sie erhalten diese Ausnahme den Call-Stack erhalten (eine der Ansichtsfenster es hätte)

  3. Das würde Ihnen die Lage in Ihrem Code zeigt, wo die Verwerfungen Stapel entstanden ist.

  4. Sie nun die Datei öffnen, die diese Quelle enthält und einen Haltepunkt setzt dort und würde das Programm diesen Punkt getroffen und im Innern des windebugger zu stoppen. Debug von diesem Punkt, und Sie würden genau wissen, aus dem Codezeile dieser Verletzung wird geworfen

Tipp: Boost kommt mit Quelle, so dass Sie leicht einen Haltepunkt in diesem Code setzen. Achten Sie darauf, F11 zu drücken, während das Debuggen, wenn Sie Asio erhalten :: Details :: win_iocp_io_service :: do_one.

Andere Tipps

Wenn Sie MSVC verwenden und die Debug-Build-Konfiguration bedeutet 0xdddddddd in der Regel, dass Sie freigegebenen Speicher zuzugreifen versuchen. Der Debug-CRT-Speicher-Manager füllt freien Speicher mit 0xdd.

Das ECX-Register hat eine ungültige Adresse (dddddddd). Ich würde vorschlagen, dies ein Fall von Speicherbeschädigung ist. Betrachten Sie gflags auf für den Prozess einschalten.

Die Aufrufliste ist völlig STL / Boost-Code. Es sei denn, etwas, was Sie tun aus dem Üblichen ist, gehe ich davon aus gewohnt, dass der Fehler in jedem Bereich der Aufrufliste ist Du eingefügt.

Ein paar Dinge zu überprüfen:

  1. Jede Boost-spezifischen #defines, die definiert werden sollen, aber Arent?

  2. Sichere SCL & Iterator Debuggen. Versuchen Sie Aktivieren / Deaktivieren es.

  3. Mischen Sie debug & Freigabecode. (Schlechte Idee, mit STL / Boost-Containern)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top