2009-11-24 3 views
11

In Visual Studio, la maggior parte dei miei oggetti e variabili non possono essere risolti durante una sessione di debug per vari motivi. Ciò significa che non posso ispezionare o guardare oggetti o che invocano le loro funzioni rendendo estremamente difficile il debug del mio codice perché la maggior parte delle mie espressioni semplicemente non funzionerà. Alcuni errori tipici che ricevo quando si aggiunge un'espressione alla finestra di controllo comprendono:Visual Studio non riesce a visualizzare alcune espressioni guardate

  • CXX0019: Errore: bad tipo gettato
  • CXX0059: Errore: operando di sinistra è classe non un nome di funzione
  • CXX0058: Errore: operatore sovraccarico non trovato

Molto spesso queste espressioni coinvolgono operatori sovraccaricati e/o oggetti di classe modello.

Perché sta succedendo? come lo aggiustate?

+0

puoi pubblicare alcune espressioni? l'uso delle finestre di controllo con algeritmi complessi (operatori) richiede problemi imho – RvdK

risposta

8

Gli errori che hai sono dovuti a limitazioni nel debugger, non ci sono bug come suggerisce Daniel.

La finestra di controllo non può chiamare operatori sovraccaricati. Se disponi ad es. a std::vector<int> vecSomething non è possibile inserire vecSomething[0] nella finestra dell'orologio, perché std::vector<int>::operator[] è un operatore sovraccarico. Di conseguenza, per un vettore di oggetti, non è possibile eseguire vecObject[0].SomeMemberVariableOfObject nella finestra di visualizzazione. Potresti scrivere vecObject._Myfirst[0].SomeMemberVariableOfObject. Nell'implementazione STL di Visual Studio, _Myfirst è un membro del vettore che punta al primo elemento.

Se si aggiungono le proprie variabili e tipi alla finestra di controllo, aggiungere direttamente gli orologi ai membri dati. Non è un problema seguire catene di puntatori come member.memberStruct.ptrToObj->memberOfObj.

Edit:

realtà Visual Studio può chiamare il codice nella finestra di controllo: http://geekswithblogs.net/sdorman/archive/2009/02/14/visual-studio-2008-debugging-ndash-the-watch-window.aspx

Così, è un po 'misteriosa per cui gli operatori di overload non possono essere utilizzati.

+3

la finestra di controllo esegue il codice – stijn

+0

@stijn: puoi elaborare? Valuta le espressioni, cioè puoi guardare "(a + b)/2", valuta il codice per formattare le espressioni seguendo le regole fornite in autoexp.dat, ma quando esegue il mio codice? – Sebastian

+0

@stijn: aggiornato il mio post. Ho scoperto che hai ragione, che le funzioni di chiamata sono consentite nella finestra di controllo. Non lo sapevo. – Sebastian

4

Why is this happening?

Lo strumento ha i suoi limiti. Ad esempio, molte volte "vado alla definizione" e la definizione non viene trovata. Devo "trovare nei file". Non sorprende che alcune espressioni non vengano valutate durante le sessioni di debug.

How do you fix it?

  • Tenere espressioni semplici. Non effettuare il concatenamento diretto di , utilizzare le variabili con i nomi esplicativi per i risultati intermedi .
  • Supporta il tuo codice con affermazioni esplicite. Se è "sbagliato", un'affermazione dovrebbe fallire.
+0

Non ricordo, esiste un operatore di asserzione nativo in C++? O si deve ideare il proprio? Inoltre, pensi che sarebbe utile scrivere funzioni wrapper come interfacce per espressioni comunemente controllate per aggirare questa limitazione del debugger? Ciò comporta un po 'più di overhead di programmazione, ma non riesco ancora a pensare ad un approccio migliore. –

+0

@Jonny assert è una macro. Viene in genere definito dal fornitore del compilatore. E sì, scrivere funzioni extra aiuterebbe a chiarire cosa sta succedendo. –

5

Il problema e le possibili soluzioni sono appunto descritte in questo Microsoft Documentation

The managed expression evaluator accepts most expressions written in Visual C++. The following topics offer specific information and discuss some of the expression types that are not supported:

Identifiers and Types 
Function Evaluation 
Operators 
Overloaded Operators 
Strings 
Casts 
Object Comparison and Assignment 
typeof and sizeof Operators 
Boxing 
Property Evaluation 
+0

Grazie, tuttavia, noto che la documentazione sembra essere errata per VS2008: dice che overload 'operatore []()' funzionerà, ma l'aggiunta di un orologio 'v [42]' per una variabile 'vector v' Errore CXX0058 - anche se '42' viene cambiato in' 42U' o '42L' o' 42LU' per soddisfare il requisito di corrispondenza esatta dei tipi di argomenti. Forse non funziona w.r.t. modelli? –

+0

@j_random_hacker Forse è a causa del modello, non so perché non ho mai usato VS2008. Quando l'operatore '[]' non funziona nella finestra di controllo è possibile visualizzare i membri interni della classe vettoriale e aggiungere un offset per guardare i dati che si desidera vedere, ma questo è molto più lento di digitare 'v [42] '. –

2

gestione dei file PDB è lungi dall'essere perfetto, certamente in progetti di grandi dimensioni. In particolare, VS ha il comportamento piuttosto stupido di unire tutti i simboli in VSxx.PDB, anche attraverso diversi progetti. L'opzione/Fd può facilmente risolvere questo; passare $(TargetDir)$(TargetName).pdb o qualcosa di simile.

1

Ho trovato una soluzione che risolve (in parte) il problema degli operatori sovraccaricati. Sembra non dipendere dagli interni della classe. È necessario utilizzare la forma estesa della chiamata operatore. Ecco un esempio per vector<int> v:

v.operator[](0) 

ho provato in Visual C++ 2012.

1

Può essere a causa di classi nidificate
Esempio:

 
    class A 
    { 
     class B 
     { 
      int i; 
     }; 
    }; 

getto come (B *) (0x12345678) non riuscirà, ma (A :: B *) (0x12345678) avrà esito positivo