2016-05-11 5 views
-1

Mein Code stürzt in der Release-Konfiguration, aber nicht die Debug-Konfiguration. Das mache ich nur, wenn ich das Programm als letzte Zeile 'return (0)' verlasse; führt aus. Ich arbeite in der Visual Studio-Entwicklungsumgebung und wenn es abstürzt, bietet VS Studio mir die Option, den Code zu debuggen. Wenn ich das wählen, führt dies zu einem Fehlerdialog, die sagen, erscheint:Release-Version abstürzt wegen msvcp120d.dll

Nicht behandelte Ausnahme bei 0x00007FF851A0512D (msvcp120d.dll) in myapp.exe: 0xC0000005: Zugriffsverletzung Leseort 0xFFFFFFFFFFFFFFFF.

Wenn ich wählen, um 'Pause', wenn diese Ausnahme auftritt, hebt es die folgende Funktion in der xstring Datei:

void _Free_proxy() 
    { // destroy proxy 
    typename _Alloc::template rebind<_Container_proxy>::other 
     _Alproxy; 
    this->_Orphan_all(); 
    _Alproxy.destroy(this->_Myproxy); 
    _Alproxy.deallocate(this->_Myproxy, 1); 
    this->_Myproxy = 0; 
    } 

und vor allem die Linie ‚_Alproxy.destroy (diese -> _ MyProxy) wird als der Täter hervorgehoben.

Ich dachte, das Problem könnte sein, dass mein "Release" -Code irgendwie mit der 'debug' msvcp120d.dll-Bibliothek verlinkt, da dies im ersten Dialog hervorgehoben ist - aber das mag nur sein, weil ich den VS benutze Debugger, um dieses Problem zu identifizieren. Aber selbst wenn das das Problem ist, bin ich unsicher, wie ich VS mit msvcp120.dll für die Release-Konfiguration und msvcp120d.dll für die Debug-Konfiguration kompilieren soll.

(Für den Datensatz, erzeuge ich alle meinen Code mit dem 'Multithreaded DLL (/ MD)' Flag in der Release-Konfiguration und der 'Multithreaded Debug DLL (/ MDD)' in der Debug-Konfiguration)

Der Kicker ist, dass, wenn die Release-Version abstürzt, der Prozess in einen 'suspended' Status übergeht und ich es nicht vollständig über Task-Manager beenden kann. Und dann kann ich nicht einmal eine neue Release-Version neu kompilieren, ohne meinen Computer neu zu starten!

Ich weiß nicht, wie man dieses Problem isoliert. Kann mir jemand sagen, wie ich das beheben könnte?


aktualisieren

Der Code für dieses Projekt ist ziemlich groß - so dass es zu einer Minimalversion Destillation, das das gleiche Verhalten zeigt, während in der Regel ein gültiger Weg, um einen Fehler zu verfolgen, eine ziemlich große Aufgabe sein würde, . Ich hatte gehofft, dass es eine Methode gab, um die Prozesse zu protokollieren und herauszufinden, welche man msvcp120d.dll @Niall nennt, ich generierte das Abhängigkeitsdiagramm und es ist riesig. Ohne etwas proprietäres zu verschenken, ist eine globale Ansicht des Graphen angebracht.
Dependency graph of entire solution Gibt es ein Tool zu verfolgen, die msvcp120d.dll aufruft?

+0

Es klingt wie Sie haben undefiniertes Verhalten in Ihrem Code. Kannst du den Exponaten das gleiche Verhalten beibringen? – NathanOliver

+2

Entweder Sie oder eines Ihrer Abhängigkeiten verbindet in msvcp120d.dll (die Debug-Version der Laufzeit) in den Release-Build. Das Mischen der Laufzeiten kann zu solchen Problemen führen. Um herauszufinden, wer, können Sie Dependency Walker verwenden, um die Struktur der Abhängigkeiten aufzulisten. – Niall

+0

msvcp120d.dll ist Teil des Visual Studio 2013-Debug-Befehls. Wenn es in Release verwendet wird, erwarte ich UB seit Debug und Release Laufzeiten miteinander inkompatibel sind. Stellen Sie sicher, dass Ihre Anwendung und alle abhängigen DLLs in derselben Konfiguration erstellt werden. Es ist auch nicht sicher, Compiler-Versionen zu mischen. – drescherjm

Antwort

2

@Niall Danke! Die Software bei Dependencywalker.com war fantastisch. Ich konnte es verwenden, um die Bibliothek zu bestimmen, die das Problem verursacht, und den Fehler aufzuspüren. Es stellt sich heraus, dass ich zuvor (vor Monaten, dummerweise) einen Systempfad zur Debug-Version dieser Bibliothek eingerichtet habe. Obwohl mein Projekt ordnungsgemäß zur Verknüpfung mit der Release-Version der Bibliothek geleitet wurde, verlinkte meine ausführbare Datei zur Laufzeit mit der Debug-Version der * .dll-Datei!

Ich löschte die Pfadvariable und stellen Sie jetzt sicher, dass eine Kopie der richtigen * .dll-Datei in meinem Release- oder Debug-Verzeichnis ist. Dann läuft und läuft alles gut.

Danke an alle, die Hilfe geleistet haben.

Verwandte Themen