2012-02-21 8 views
11

Durante il tentativo di rispondere a this question ho deciso che è necessario eseguire il processo di marshalling a mano, nella vista del debugger.Passa attraverso la "transizione verso la transizione nativa" in Visual Studio?

Sfortunatamente, Visual Studio sembra saltare sopra tutto questo codice interessante. Ecco il P/Invoke chiamata a GetProfilesDirectory (una funzione WinAPI):

enter image description here

ma dopo entrare in questa chiamata (F11), non mi trovo a FFF9BFD8; piuttosto, atterro a destra nel codice GetProfilesDirectory:

enter image description here

C'è anche l'entrata [Managed to Native Transition] sullo stack, alludendo al fatto che Visual Studio aveva appena saltato sopra un sacco di codice.

Come posso passare attraverso questa transizione?

+5

Beh accidenti, ho trovato il problema già: si sta utilizzando un font a larghezza variabile in un editor di codice! È solo follia. –

+1

Il sacrilegio! Meglio chiedere ai potenziali assunti che tipo di carattere usano, per assicurarmi di non scivolare nella mia follia! –

risposta

3

Sono sorpreso che nessuno abbia suggerito di mostrare il codice esterno nella finestra di debug. Se fai clic con il pulsante destro del mouse sulla riga [Native to Managed Transition] e seleziona l'opzione Show External Code, vedrai esattamente quali metodi vengono chiamati nella transizione. Questo potrebbe darti un'idea migliore. Ecco un esempio:

Display Native to Managed Transition

Sarete quindi in grado di fare doppio clic su qualsiasi linea (in grigio) e una pagina Disassembly si aprirà con il codice. Un altro esempio:

enter image description here

1

In Visual Studio, non è possibile farlo, ovvero non è possibile invertire il debugger VS in una modalità per vedere cosa sta succedendo durante la transizione da gestita a nativa.

Si potrebbe provare WinDbg + SOS/SOSEX invece come WinDBG non nasconde questo tipo di dettagli. Tuttavia, quella parte è o l'astrazione interna di .NET o di Windows, quindi anche se potessi vederlo, potresti non ottenere molto, come per vedere cosa sta succedendo lì (oltre all'assemblaggio), avrai bisogno di simboli privati ​​per mscorlib, mscoreei o clr dlls (file pdb).