2009-10-12 11 views
8

Il mio codice C# sta chiamando una funzione di libreria di terze parti non gestita tramite P/Invoke e la funzione non gestita sta avendo alcuni strani effetti collaterali. Voglio fare il debug e vedere cosa sta facendo.Passaggio a una chiamata P/Invoke in vista di disassemblaggio

Se eseguo il debug del mio codice C# e provo a "Esegui" la chiamata P/Invoke, viene invece eseguito il passaggio. Nessuna sorpresa lì - mi aspettavo questo; non ha il sorgente per questa DLL e non ho detto che stavo bene guardando la vista dello smontaggio.

Così ho spostato il debugger in vista del disassemblaggio (Debug> Windows> Disassembly). Ora vedo le singole istruzioni x86 nel mio codice JITted. Ancora una volta cerco di entrare nella chiamata P/Invoke. Anche in questo caso, invece, si arresta - anche se ho chiaramente detto di passare a un'istruzione CALL x86. Quanto è difficile entrare in una chiamata x86?

mio Googling finora mi ha mostrato un paio di opzioni che possono influenzare questo, e li ho già fissato:

  • In Strumenti> Opzioni> Debugging> Generale, "Attiva Just My Code" è incontrollato.
  • In Progetto> Proprietà> scheda Debug, "Abilita debug del codice non gestito" è selezionato.

Non va bene. Visual Studio si rifiuta ancora di intervenire.

Non ho un PDB per la DLL di terze parti, ma non dovrebbe essere importante. Non mi interessa il codice sorgente o le informazioni sui simboli. (Beh, in realtà sarebbero davvero carini, ma so già che non li otterrò.) Visual Studio può eseguire il debug di x86 (ecco cos'è la vista Disassemblaggio per) e tutto ciò che voglio fare è passo nel codice x86.

Cos'altro devo fare per ottenere VS per consentirmi di entrare nelle istruzioni x86 all'interno di una chiamata P/Invoke?

+0

Hai mai capito questo? – Dennis

+1

Sono passati alcuni anni da quando ho provato a farlo, ma come ricordo, no, non l'ho mai fatto funzionare. –

risposta

1

Una cosa che proverei è passare da C# a codice C++/CLI e quindi da C++ al codice di terze parti. Una volta che sei in C++ (e privo dell'infrastruttura P/Invoke), potresti avere più fortuna con la vista di smontaggio.

+1

Non conosco praticamente nulla sulla scrittura di codice C++/CLI ... ho qualche link che possa aiutarmi a iniziare con questa strategia? –

4

This possono aiutare a risolvere il problema: (da Graviton)

CallingConvention = CallingConvention.Cdecl 

anche this menzioni che è necessario staccare debugger gestito e non gestito ricollegare quando attraversano i confini. Potrebbe essere necessario verificare le funzionalità del debugger misto e le sue preferenze da MSDN.

E, infine, utilizzando Ed Dore' risposta:

Sotto dialogo Tools.Options, selezionare la categoria Debug , e assicurarsi che il "Attiva Just My Code" impostazione è incontrollato. Dalle proprietà del progetto , selezionare la scheda Debug e quindi assicurarsi che "Abilita debug del codice non gestito" sia selezionato.

Una volta ottenuti questi quadrati, si dovrebbe ottenere il supporto per il debugging della modalità mista funzionante.

Inoltre, se si utilizza "Debug.Attaccare Per Processo", essere sicuri di colpire il 'Seleziona ...' pulsante nella 'Allega Per' finestra di dialogo processo, e selezionare sia gestito e supporto per il debugging nativo.

+0

Nessuno di questi aiuti passo alle chiamate ai metodi framework in VS2017/Win10 :( –

1

In C# proprietà del progetto , nella scheda debug, selezionare Attiva il debug di codice nativo. ha lavorato per me in VS 2012.

merito va a billb.

Inoltre, dal momento che si tratta di una libreria di terze parti, garantire Attiva Just My code è selezionata in Opzioni > Debug.

0

Avevo un problema simile in cui stavo eseguendo il debug di un C# exe che ha chiamato la mia dll C++ tramite PInvoke, tutti parte della stessa soluzione. L'abilitazione del debug del codice nativo nel mio progetto C# mi ha permesso di eseguire il debug del mio codice C++.

Problemi correlati