2014-11-27 10 views
9

Sto provando a eseguire il debug di una DLL C# da un eseguibile C++ nativo. Ho un oggetto COM C# che viene caricato ed eseguito da codice nativo tramite IDispatch. Tutto è costruito in Debug, sia in C# che in C++. Mentre posso vedere tutto il codice C++, e tutte le DLL C++ hanno i loro simboli caricati e disponibili per il debug, i breakpoint ecc. Il codice C# si rifiuta di giocare."skipped loading symbols for ngen binary" per C# dll

Quello che vedo è che le DLL di C# si rifiutano di caricare il loro simbolo pdbs, riportando "simboli di caricamento saltati per binario ngen" nella finestra dei moduli.

Per inciso, sto eseguendo il debug della soluzione C# qui, ho impostato l'eseguibile nativo come 'start programma esterno' nelle impostazioni di debug del progetto COM.

Ora posso avviare l'eseguibile C++ e quindi collegarlo a esso, quindi tutto funziona come previsto - i simboli si caricano e posso impostare i punti di interruzione nel C#.

Si sta utilizzando Visual Studio 2013u4. Esiste un'impostazione per abilitare il debug in modalità mista? Un problema è che il codice nativo è stato creato con VS2010.


Modules output when debugging external process

Ecco la finestra del modulo - di notare tutte le PDBs e DLL sono in una singola directory, è possibile vedere le DLL C++ caricati, ma non i C# quelli.

Modules output after attach to process

Ecco la finestra moduli - nota il 3 ° voce per il dll EVCom (l'oggetto COM) che presumo sia la voce che permette il debug.

Non c'è nulla di interessante nella finestra di output, quando si tratta di caricare la DLL COM, vedo quanto segue (nel caso di allegare al processo in esecuzione, l'altro ha solo 2 righe caricate invece di 3).

'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'. 
'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'. 
'Explorer.exe' (Win32): Unloaded 'C:\...\lib\debug\EvCom.dll' 
'Explorer.exe' (Win32): Loaded 'C:\Dev\...\lib\debug\EvCom.dll'. 

Una cosa di interesse - ho controllato il "Usa Managed Compatibility Mode" nelle impostazioni di debug e, pensava che ancora non viene caricato i miei simboli quando si avvia il debug, mostra solo 1 voce nella lista dei moduli. Questa volta dire "Nessun simbolo nativo nel file di simboli" per le DLL di C#.

Sembra che il problema non sia la possibilità di selezionare il tipo di debugger in VS2013 (o 2012). This connect article suggerisce "design" con alcuni accorgimenti.

+4

progetto Fare clic con il C++, Proprietà, debug, debugger Type = misto. –

+0

Non esiste un progetto C++, sto eseguendo il debug del mio progetto C# in VS2013, e non c'è nessuna impostazione di questo tipo, il progetto nativo è costruito esternamente e non è referenziato all'interno di VS come progetto. – gbjbaanb

+0

"Posso vedere tutto il codice C++" è ... strano allora. È già necessario attivare il debug in modalità mista, l'unico modo per vedere il codice C++. Concentrati sull'avvertimento strano sui binari ngen, non è normale. Non dovresti mai eseguire il debug del codice. Eseguire ngen/uninstall per sbarazzarsi di esso. –

risposta

7

scopre che è tutta una questione di cambiamenti nel motore di debug per .NET 4.0

.NET 4 e una maggiore utilizza un motore di debug diverso rispetto .net 3.5 e di seguito, quando si avvia il debug di un'applicazione nativa il debugger sceglierà un debugger .net per te (predefinito su .net 4.0) e se la tua .net dll è costruita usando questa piattaforma, tutto andrà bene - i punti di interruzione saranno colpiti.

Se la DLL caricata è .net 3.5, il motore di debug non comprenderà le DLL che vengono caricate e rifiuterà di caricare i simboli o il debug.

Le soluzioni possono essere ricostruite come .net 4 oppure avviare l'eseguibile nativo e collegarsi ad esso (dove è possibile selezionare il tipo di debugger, sia "vecchio" .net o "nuovo" .net) oppure è possibile creare un progetto dall'eseguibile e imposta le sue impostazioni di debug per specificare il debugger corretto.

Quello che trovo fastidioso è che Microsoft potrebbe facilmente aver avviato il debugger utilizzando il tipo di framework .NET specificato nel progetto di cui si sta eseguendo il debug (dopo tutto, quando si esegue il debug di una DLL e si specifica un programma esterno, si desidera comunque eseguire il debug la dll per cui stai premendo F5!) (Cosa è ancora più fastidioso è che una volta che il debug gestito è avviato in una DLL caricata, puoi quindi entrare in progetti costruiti usando vecchi framework .net senza problemi).

Maggiori dettagli su this Microsoft connect articolo

1

(Se il file eseguibile non è già nella soluzione, File> Aggiungi> progetto esistente, quindi fare clic destro e impostarlo come progetto di start-up.)

Fare clic con il tasto destro del mouse sul progetto di avvio, Proprietà, Debug, Tipo debugger = Misto.

+0

hai letto più del commento di Hans Passant? Controlla la risposta accettata per i motivi per cui la tua risposta non è corretta. – gbjbaanb

+1

@gbjbaanb - Ho avuto un problema. L'ho cercato su google. Ho trovato questa pagina. La soluzione * che ha funzionato per me * era in un commento. I commenti sono transitori, quindi l'ho copiato in una risposta per assicurarmi che sia disponibile per le persone in futuro. La tua risposta è molto importante nel * perché *, ma il vero punto cruciale della correzione non è chiaro. Leggendolo di nuovo ora, trovo che la risposta sia "imposta le sue impostazioni di debug per specificare il debugger corretto", ma senza il commento di Hans Passant non saprei dove posizionare le impostazioni di debug o cosa sia il "debugger giusto". – AndyT

+0

Forse la mia situazione è leggermente diversa dalla tua (visto che avevo già creato un progetto dall'eseguibile) avrei dovuto fare una nuova domanda e ho postato questa risposta su questo. Ma pensavo che sarebbe stato uno spreco di tempo per tutti. – AndyT

0

Nel mio caso ho un proprio server dei simboli e TFS, quindi ho l'opzione abilitata TOOLS> Opzioni> Debug> Generale> "Abilita supporto del server di origine" e tre opzioni figlio.

0

per me è stato il debug di un'applicazione UWP in forme Xamarin:

Causa: Il debugger è saltare i file non nell'ambiente .NET.

Soluzione: Deseleziona Debugging => Generale => Attiva Just My Code