2015-11-10 3 views
11

Il mio problema è fondamentalmente che ogni volta che eseguo il debug usando Visual Studio (edizione 2015 della Community su Windows 10), e provo a passare il mouse su una variabile o guardare una variabile nella gente locale o sezione automatica della vista di debug, non vedo i dati effettivi salvati nella variabile.Debugger mostra npos = 4294967295 durante la visualizzazione delle variabili stringa

Questo è un problema che ho riscontrato con stringhe e vettori. Per le stringhe, mostrerà npos = 4294967295

e se si mantiene facendo clic sul menu a discesa frecce, vi troverete infine arrivare alla stringa effettiva salvato in quella variabile; solo dopo aver scavato nella struttura interna della variabile, come std::_String_alloc e _Mypair e _Myval, ecc. Lo stesso per i vettori.

Qualcuno ha mai sperimentato questo problema o sa come risolverlo?

+0

Mostrate una schermata di questo? 'std :: string' ha un membro statico chiamato' npos' che è massimo che 'std :: string :: size_type' può contenere. – NathanOliver

+0

VS viene fornito con file di tipo XML che descrivono come visualizzare le strutture di dati std. In qualche modo, questi non funzionano per te. Ho visto accadere questo sulla macchina di qualcun altro, ma non abbiamo mai capito come risolverlo. – melak47

+0

Sei sicuro che le variabili che cerchi di visualizzare siano nel tuo attuale ambito? Altrimenti le variabili dall'aspetto non inizializzato sono normali. – peroket

risposta

0

4294967295 è 0xffffffff che è una parola a 32 bit con tutti i bit. Sulla maggior parte delle macchine, è anche (unsigned)-1 che è la solita costante str::npos.

BTW, hai provato a utilizzare GCC per compilare il codice con g++ -Wall -g? Quindi utilizzare gdb per il debug.

+2

Ho perso il punto della domanda esattamente nello stesso modo in prima lettura. La domanda non sta chiedendo perché std :: string :: npos è 4294967295. La domanda è chiedere perché Visual Studio mostra il valore di 'std :: string :: npos' invece di mostrare il valore della stringa specifica su cui è posizionato il cursore al di sopra di. Una std :: string ha più membri, incluso il membro statico 'npos', quindi un debugger ha bisogno di qualche conoscenza in più per mostrarti il" valore "di una stringa. – JSF

7

Ho avuto lo stesso problema. Presumo che stai eseguendo il debug di una DLL C++ non nativa (nativa) che fa parte di una soluzione che utilizza un EXE gestito? Nel mio caso ho un EXE WPF C# che PInvokes funziona in una DLL C++ non gestita.

"correzioni" che hanno lavorato nel mio caso:

FIX 1: Deseleziona "Utilizza la modalità di compatibilità gestito" nelle impostazioni del debugger: È possibile farlo in Strumenti/Opzioni/Debug/Generale. Vedere: https://stackoverflow.com/a/33462362/5556801 Per qualche discussione di ciò che "modalità gestita compatibilità" è, e perché normalmente si desidera senza controllo, vedi: http://blogs.msdn.com/b/visualstudioalm/archive/2013/10/16/switching-to-managed-compatibility-mode-in-visual-studio-2013.aspx

"Fix" 2: Come un parziale di work-around è possibile innanzitutto avviare il processo di senza il debugger (Ctrl + F5), quindi collegare il debugger VS2015 al processo (Debug/Attach-to-Process), ma selezionare solo "Native code" con il pulsante "Attach to/Select ...". Ora, quando viene colpito un punto di interruzione nella tua DLL C++ nativa, puoi passare il mouse sopra le variabili std :: string e VS2015 mostrerà il loro contenuto completo come previsto, inclusi i membri dei dati. Lo svantaggio di questo work-around basato su codice nativo è che non sarai in grado di eseguire il debug del tuo codice gestito (ad esempio C# o CppCli) allo stesso tempo.

+0

La correzione 1 ha funzionato per me in VS2015, grazie per aver risparmiato ore del mio tempo! – Kajal

1

Nelle proprietà del progetto selezionare Debug-> Tipo debugger-> Solo nativo. Nel mio caso è stato Misto