2015-11-10 6 views
11

Mein Problem ist grundsätzlich, dass, wenn ich Debugging mit Visual Studio (2015 Community Edition auf Windows 10 Maschine), und ich versuche, über eine Variable oder eine Variable in den Locals oder Auto-Abschnitt der Debug-Ansicht, sehe ich nicht die tatsächlichen Daten in der Variablen gespeichert.Debugger zeigt Npos = 4294967295 beim Anzeigen von String-Variablen

Dies ist ein Problem, das ich mit Strings und Vektoren gesehen habe. Für Strings zeigt es npos = 4294967295

und wenn Sie weiterhin auf die Dropdown-Pfeile klicken, werden Sie schließlich zu der tatsächlichen Zeichenfolge in dieser Variable gespeichert werden; nur nach dem Graben in die interne Struktur der Variablen, wie std::_String_alloc und _Mypair und _Myval, etc. Das gleiche für Vektoren.

Hat jemand dieses Problem schon einmal erlebt oder weiß, wie es zu beheben ist?

+0

Zeigen Sie einen Screenshot von diesem? 'std :: string' hat ein statisches Element mit dem Namen' npos', das maximal von 'std :: string :: size_type' gehalten werden kann. – NathanOliver

+0

VS kommt mit XML-ähnlichen Dateien, die beschreiben, wie man Standarddatenstrukturen visualisiert. Irgendwie funktionieren diese nicht für Sie. Ich habe gesehen, dass dies auf der Maschine eines anderen passiert ist, aber wir haben nie herausgefunden, wie wir es lösen können. – melak47

+0

Sind Sie sicher, dass die Variablen, die Sie zu visualisieren versuchen, in Ihrem aktuellen Umfang liegen? Ansonsten sind die nicht initialisierten Variablen normal. – peroket

Antwort

0

4294967295 ist 0xffffffff das ist ein 32-Bit-Wort mit allen ein Bits. Bei den meisten Maschinen ist das auch (unsigned)-1, was die übliche str::npos Konstante ist.

BTW, haben Sie versucht, mit Ihren Code mit g++ -Wall -g zu kompilieren? Verwenden Sie dann gdb zum Debuggen.

+2

Ich habe den Punkt der Frage auf genau die gleiche Weise selbst beim ersten Lesen verpasst. Die Frage ist nicht, warum std :: string :: npos 4294967295 ist. Die Frage ist, warum Visual Studio den Wert von 'std :: string :: npos' anzeigt, anstatt den Wert der spezifischen Zeichenkette anzuzeigen, die der Cursor enthält Über. Ein std :: string hat mehrere Member, einschließlich des statischen Members 'npos', so dass ein Debugger zusätzliche Kenntnisse benötigt, um den" Wert "eines Strings anzuzeigen. – JSF

7

Ich hatte das gleiche Problem. Ich nehme an, dass Sie eine nicht verwaltete (native) C++ - DLL debuggen, die Teil einer Lösung ist, die eine verwaltete EXE verwendet? In meinem Fall habe ich eine C# -WPF-EXE, die PInvokes in einer nicht verwalteten C++ - DLL funktioniert.

"Fixes", die in meinem Fall gearbeitet:

FIX 1: Uncheck "Use Managed Kompatibilitätsmodus" in den Debugger-Einstellungen: Sie können dies unter Extras/Optionen/Debugging/General. Siehe: https://stackoverflow.com/a/33462362/5556801 Seit einiger Diskussion darüber, was „Managed-Kompatibilitätsmodus“ ist und warum Sie es normalerweise nicht markiert wollen, finden Sie unter: http://blogs.msdn.com/b/visualstudioalm/archive/2013/10/16/switching-to-managed-compatibility-mode-in-visual-studio-2013.aspx

„FIX“ 2: Als Teil Behelfslösung können Sie zunächst Ihren Prozess starten ohne den Debugger (Strg + F5), fügen Sie dann den VS2015-Debugger an Ihren Prozess an (Debug/Attach-to-Process), aber wählen Sie nur "Nativen Code" mit der Schaltfläche "Anfügen/Auswählen ...". Jetzt, wenn ein Breakpoint in Ihrer nativen C++ DLL getroffen wird, können Sie den Mauszeiger über die Variablen von std :: string bewegen und VS2015 zeigt ihren vollen Inhalt wie erwartet an, einschließlich ihrer Datenmitglieder. Der Nachteil dieses Workarounds mit systemeigenem Code ist, dass Sie Ihren verwalteten Code (z. B. C# oder CppCli) nicht gleichzeitig debuggen können.

+0

Fix 1 funktionierte für mich in VS2015, danke für das Speichern von Stunden meiner Zeit! – Kajal

1

Wählen Sie in den Projekteigenschaften Debugging-> Debugger-Typ-> Nur Native. In meinem Fall war es Mixed

Verwandte Themen