Domanda

Ecco qualcosa che so sia probabilmente possibile ma non sono mai riuscito a fare
In VS2005 (C ++), Durante il debug, per poter richiamare una funzione dal codice di cui sto eseguendo il debug.
Questa funzionalità è talvolta essenziale quando si esegue il debug di strutture di dati complesse che non possono essere esplorate facilmente utilizzando solo le normali funzionalità della finestra di controllo.
La finestra dell'orologio sembra consentire la scrittura di chiamate di funzione ma ogni volta che lo provo mi dà un errore o un altro.

Errore: simbolo " func " non trovato
Errore: l'elenco degli argomenti non corrisponde alla funzione
Errore: funzione membro non presente

Qualcuno è mai riuscito a farlo funzionare correttamente? Cosa mi sto perdendo qui?

Modifica: chiaramente, la funzione chiamata dovrebbe essere un simbolo esistente nell'ambito corrente in cui si trova il debugger.

È stato utile?

Soluzione

Ok, ecco cosa ho trovato
CXX0040 significa che " Il valutatore di espressioni C non supporta conversioni implicite che coinvolgono chiamate del costruttore. "
CXX0047 significa che " Le funzioni sovraccaricate possono essere chiamate solo se esiste una corrispondenza esatta dei parametri o una corrispondenza che non richiede la costruzione di un oggetto. "

Così combinato significa che se voglio chiamare una funzione nessuno degli argomenti dovrebbe avere una conversione implicita e nessuno degli argomenti dovrebbe aver bisogno di una costruzione.
"conversione implicita" in questo contesto sembrano includere cose banali come la conversione di 'String' in 'const String & amp;' .
& Quot; costruzione " sembra includere una banale copia-costruzione. quindi passare per valore tutto ciò che non è un tipo primitivo comporterà un errore.

Quindi questo lascia sostanzialmente funzioni che accettano solo tipi o puntatori primitivi.
Ho appena testato questa teoria con successo.

Quindi, se vuoi essere in grado di chiamare un metodo dalla finestra di controllo, aggiungi un sovraccarico che accetta solo puntatori e primitive e nella finestra di controllo passa gli argomenti in modo appropriato. Per passare un oggetto che non è una primitiva, passa il suo indirizzo.

Altri suggerimenti

La finestra di controllo è limitata dal contesto in cui si trova il codice corrente, ad esempio, quando il codice entra in una funzione e si tenta di accedere a un'altra funzione nascosta dall'ambito della funzione corrente, non funzionerà.

Se invochi una funzione nella finestra di controllo, assicurati che sia visibile e accessibile dall'ambito corrente.

Per quanto ne so, non è possibile eseguire il codice dalla finestra di controllo durante il debug del C ++ non gestito. Questo funziona per C # (e probabilmente VB.NET e C ++ gestito, ma non ne sono sicuro). Quindi probabilmente lo consente perché funziona per alcune lingue, ma non per altre.

Troviamo che questo funzioni in un modo molto incostante. Alcune funzioni molto semplici (comprese le funzioni membro) funzionano, in genere semplici getter di proprietà. Altre funzioni più complesse non funzionano e forniscono un errore.

Non sono mai stato in grado di discernere le regole precise ...

Non l'ho provato, ma ho sempre pensato che fosse la finestra immediata (esecuzione del codice)

Cameron

È il " immediato " finestra che desideri. E sei limitato a ciò che è visibile da dove si trova il tuo punto di interruzione attuale. Variabili locali e funzioni su quella classe (o globali)

Nella mia esperienza, ci sono alcune carenze con la finestra immediata. Non puoi chiamare le funzioni membro delle tue classi se le classi provengono da una DLL diversa, ma visualizzano messaggi di errore fuorvianti. Se qualcosa è nella stessa DLL (ad esempio collegando staticamente tutte le altre cose), chiamare i membri è abbastanza affidabile. Ma cose complesse possono o meno funzionare, come menzionato da altri.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top