Come si abilita "Abilita il source stepping .NET Framework"?


118

Aggiornamento 22 febbraio 2013 : la voce di Microsoft Connect contiene una nota di Alok Shriram (Program Manager, librerie di classi di base, .NET Framework) che indica che il problema dovrebbe essere risolto. La voce Connect è contrassegnata come Risolto (fisso) :

Questo problema dovrebbe ora essere risolto. Abbiamo pubblicato un aggiornamento per le fonti di riferimento. Fateci sapere nel caso in cui il problema non sia ancora risolto.

Anno e mezzo.

Link bonus

Domanda originale

Come si abilita il passaggio all'origine di .NET Framework in Visual Studio 2010?


Nota : questa domanda è un pezzo di un insieme più grande:


Visual Studio 2010 include una nuova funzionalità:

  • Strumenti, Opzioni, Debug, Generale, Abilita stepping sorgente .NET Framework

Screenshot del menu delle opzioni

Seguendo le istruzioni nella pagina MSDN Procedura: eseguire il debug dell'origine .NET Framework :

Per abilitare il debug del codice sorgente .NET Framework

  1. Nel menu Strumenti , fare clic su Opzioni .

  2. Nella finestra di dialogo Opzioni , fare clic sulla categoria Debug .

  3. Nella casella Generale selezionare le seguenti caselle di controllo:

    • Abilita il passaggio all'origine di .NET Framework
    • Abilita il supporto del server di origine

Lo faccio:

Screenshot del menu delle opzioni, che evidenzia le opzioni pertinenti selezionate

Nota : noterai, come nota la pagina MSDN e come ho notato, che selezionando Abilita stepping sorgente .NET Framework verrà automaticamente deselezionata ** Abilita solo il mio codice (solo gestito). Ho anche abilitato i messaggi di diagnostica del supporto del server di origine.

L'attivazione di queste opzioni imposta automaticamente un percorso di download della cache dei simboli per me:

Screenshot del menu delle opzioni, che mostra la directory della cache (evidenziata)

Nota : la voce Microsoft Symbol Server è già presente (e non può essere rimossa).


La pagina MSDN dice di caricare i simboli:

Per caricare i simboli del Framework utilizzando la finestra Moduli

  1. Nella finestra Moduli , fare clic con il pulsante destro del mouse su un modulo per il quale non sono stati caricati i simboli. Puoi sapere se i simboli vengono caricati o meno guardando la colonna Stato simboli .

  2. Punto a caricare Da Simboli e fare clic su server Microsoft Symbol simboli scaricare dal simboli pubblici server Microsoft o simbolo Percorso a carico da una directory in cui si dispone di simboli precedentemente memorizzati.

Provo questo:

inserisci qui la descrizione dell'immagine

e quindi vengono caricati tutti i simboli:

Screenshot della finestra dei moduli, come descritto sopra

Sono stato seduto su un punto di interruzione, che sta per chiamare il codice .NET framework:

Screenshot del codice, trascritto di seguito

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

Il push F11fa sì che il debugger salti semplicemente alla riga successiva:

Screenshot del codice, trascritto di seguito

protected override void ScaleControl(SizeF factor, BoundsSpecified specified)
{
    base.ScaleControl(factor, specified);

    //Record the running scale factor used
    this.scaleFactor = new SizeF(
            this.scaleFactor.Width * factor.Width,
            this.scaleFactor.Height * factor.Height);

Come si abilita il passaggio all'origine di .NET Framework in Visual Studio 2010?


Sono seduto in un punto di interruzione nel mio codice. Provo a fare doppio clic su una funzione più in alto nello stack di chiamate. Questo mi permetterebbe, spero, di passare al codice .NET:

inserisci qui la descrizione dell'immagine

Tranne che non funziona: Visual Studio mi dice che non ci sono sorgenti disponibili:

Screenshot del messaggio di errore che dice No Source Available

Come si abilita il passaggio all'origine di .NET Framework in Visual Studio 2010?


Se passo alla visualizzazione di disassemblaggio prima di provare ad entrare nel codice .NET ( Debug -> Windows -> Disassembly ), posso vedere un callnel codice .NET:

Screenshot del codice

E quando lo faccio, finisco per eseguire il debug di un disassemblaggio di System.Windows.Forms.ScaleControl:

Screenshot della finestra di smontaggio

Che non è lo stesso, o utile come, essere in grado di entrare nel sorgente .NET Framework.

Come si abilita il passaggio all'origine di .NET Framework in Visual Studio 2010?


Il percorso della cache dei simboli configurato sul mio computer contiene i file della cache dei simboli:

Screenshot dell'elenco delle cartelle

Quindi sta scaricando pdbfile di simboli, ma si rifiuta di usarli.

Come si abilita il passaggio all'origine di .NET Framework in Visual Studio 2010?


Leppie mi ha suggerito di controllare il Debugregistro (con la finestra del registro di debug aperta, altrimenti non registra nulla):

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

In precedenza nel registro lo vedo caricare simboli per System.Windows.Forms.dll:

Loaded 'C:\Windows\assembly\GAC_MSIL\System.Windows.Forms\2.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Symbols loaded.

inserisci qui la descrizione dell'immagine

Quindi è trovare i miei simboli, ma affermare di non essere riuscito a trovarli.

Come si abilita il passaggio all'origine di .NET Framework in Visual Studio 2010?


Un ragazzo di Microsoft Italia suggerisce di disattivare Richiedi file sorgente in modo che corrispondano esattamente alla versione originale :

Screenshot della finestra delle opzioni

Questo non l'ha risolto.

Come si abilita il passaggio all'origine di .NET Framework in Visual Studio 2010?


È stato suggerito che ci sia un bug con il server di origine di Microsoft per .NET Framework 4.0 . Seguendo questo suggerimento, ho cambiato il progetto in .NET Framework 3.5 :

inserisci qui la descrizione dell'immagine

Questo non l'ha risolto.

Come si abilita il passaggio all'origine di .NET Framework in Visual Studio 2010?


Qualcuno da qualche parte si chiedeva pigramente se un'altra persona con lo stesso problema stesse utilizzando la versione a 64 bit del debugger . Ora, non esiste una versione a 64 bit di Visual Studio, ma ho provato a cambiare il mio progetto da AnyCPU a x86 (era JITed a x64), nel caso in cui Microsoft non supporti i processori a 64 bit:

inserisci qui la descrizione dell'immagine

Questo non ha risolto il problema:

Step into: Stepping over method without symbols 'System.Windows.Forms.Form.ScaleControl'

Come si abilita il passaggio all'origine di .NET Framework in Visual Studio 2010?


Guarda anche


Hai controllato il codice sorgente "cache"?
leppie

@leppie Cosa intendi con "codice sorgente 'cache'"? Se intendi la cartella che memorizza nella cache il codice sorgente, viene popolata (vedi aggiornamento 4 )
Ian Boyd

Sì. È possibile aprire quel file sorgente e impostare un punto di interruzione?
leppie

1
eccellente redazione del problema!
andersonbd1

1
Non funziona neanche in VS2012. Ha funzionato per un giorno, dopo aver configurato tutto e smesso di funzionare. Due giorni, dozzine di caffè, centinaia di pagine web dopo, semplicemente non funziona. Allo stesso tempo, le fonti pubblicate da symbolsource.org funzionano come un incantesimo.
Wiktor Zychla

Risposte:


35

I PDB per passare attraverso il codice sorgente vengono registrati solo per RTM e Service Pack. Pertanto, quando l'aggiornamento della sicurezza esce e modifica la dll di cui stai tentando di eseguire il debug, non funzionerà il passaggio alla fonte (ovvero, otterrai "Nessuna fonte disponibile" con un "Sfoglia per trovare la fonte ").

Tuttavia, dopo aver effettuato tutte le impostazioni appropriate, è possibile utilizzare la seguente soluzione alternativa. La soluzione alternativa consiste essenzialmente nel trovare gli aggiornamenti di sicurezza che hanno causato la modifica della dll e quindi rimuoverli. Questo ha l'ovvio svantaggio di rimuovere quegli aggiornamenti di sicurezza sulla tua macchina.

Soluzione

  1. Identifica su quale dll vuoi eseguire il debug (ad esempio System.Windows.Forms.dll)
  2. Durante il debug, apri la finestra Moduli in Visual Studio, trova la colonna Versione . Se la versione non è la versione RTM o Service pack, sarà necessario eseguire il flusso di lavoro. Tipicamente la dll RTM dirà "costruito da: RTMRel". Mentre una dll che faceva parte di un aggiornamento per la protezione dirà "costruito da: RTMGDR". Annotare il numero di versione (ad esempio 4.0.30319.269 costruito da: RTMGDR)
  3. Ora vogliamo trovare l'aggiornamento che ha creato questa versione. Fallo cercando il dll e il numero di versione su support.microsoft.com/kb/ Ad esempio, ho eseguito la seguente ricerca su Google: site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269
  4. La ricerca dovrebbe fornire informazioni su un aggiornamento. Prendere nota del numero KB nella barra degli indirizzi. Nel mio esempio l'indirizzo era http://support.microsoft.com/kb/2604121, quindi KB2604121, è ciò che ci interessa.
  5. Vai a Pannello di controllo-> Programmi e funzionalità e fai clic su "Visualizza aggiornamenti installati"
  6. Trova un aggiornamento che elenca il numero KB (puoi utilizzare la ricerca nella casella in alto a destra).
  7. Disinstalla l'aggiornamento.
  8. Ripetere questo processo per la stessa dll finché la dll non torna alla sua versione RTMRel o SP. Ad esempio, per System.Windows.Forms.dll, ho dovuto rimuovere KB2686827, KB2604121, KB2518870 prima che tornasse alla versione RTMRel.

Dovrai farlo per ogni dll all'interno del framework .NET in cui ti interessa eseguire il debug.

Una volta fatto, imposta un punto di interruzione all'interno dell'origine .net (ad esempio, vai alla scheda Punti di interruzione, dì Nuovo-> Interrompi alla funzione e inserisci System.Windows.Forms.Form.Form) o entra in uno dei .net metodi in quella dll.


1
Bene, il trucco sta nell'individuare quelli corretti da disinstallare (dato che di solito ne hai installati molti e la disinstallazione richiede un po 'di tempo).
Matt Smith

Non riesco a disinstallare gli aggiornamenti di sicurezza. È contro la politica aziendale. C'è un modo per ottenere copie di mscorlib.dll (e altri) che corrispondono al server Microsoft Symbols? Il mio mscorlib.dll è la versione 4.0.30319.269 (RTMGDR.030319-2600). Forse, potrei aggiornare temporaneamente GAC con questa nuova DLL e provare a eseguire il passaggio alla fonte.
kevinarpe

Probabilmente è anche contro la mia politica aziendale: li reinstallo dopo aver finito. Non penso che potresti semplicemente inserire una vecchia versione mscorlib.dll indipendente dalle altre DLL che dovrebbero essere ripristinate con esso (affinché funzioni correttamente). Inoltre, l'aggiornamento temporaneo del GAC con le vecchie DLL sarebbe essenzialmente equivalente alla disinstallazione temporanea dell'aggiornamento per la protezione.
Matt Smith

La probabile ragione per cui Microsoft non rilascia la fonte per gli aggiornamenti di sicurezza è che qualcuno potrebbe confrontare le modifiche al codice, capire quale fosse la vulnerabilità della sicurezza e creare i propri exploit. Ciò di cui Microsoft non si rende conto è che il "codice sorgente" è già disponibile utilizzando ILSpy o Relfector. Quindi Microsoft, non rilasciando il codice sorgente, in realtà non sta rendendo nessuno più sicuro - è solo che gli sviluppatori vivono più difficili.
Ian Boyd

2
@IanBoyd Dubito che questa sia la motivazione della SM. Presumo che il loro flusso di lavoro semplicemente non supporti l'aggiornamento dei PDB di origine per il debug. Si preoccupano principalmente di chiudere le falle di sicurezza.
xanadont

6

Anche se sfortunatamente c'è un problema con un Microsoft, come ha sottolineato Leppie (e ho ottenuto lo stesso risultato, vedi

va notato che il tuo tentativo fallirà comunque, poiché hai fatto riferimento a:

  • Microsoft Symbol Server

invece di:

  • referencesource.microsoft.com/symbols

Vedere la sezione Domande frequenti / Risoluzione dei problemi di Configurazione di Visual Studio per il debug del codice sorgente di .NET Framework


4

Ho trovato la risposta, credo.

Ho rintracciato cosa stava succedendo su Fiddler. Sembra che al momento siano disponibili solo i simboli e nessuna fonte.

Quando VS tenta di caricare i simboli dal server "reference source", fallisce (404). Poiché ciò non riesce, penso che non sia possibile mappare i file di origine su quel server.

http://referencesource.microsoft.com/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pdb

Dopo il suddetto errore, prova un server chiamato "msdl" dove trova il PDB effettivo (ma sembra che questo non abbia informazioni sul codice sorgente).

http://msdl.microsoft.com/download/symbols/mscorlib.pdb/ED96A7F38A2940F39B9CA7AD9BC5CB671/mscorlib.pd_

Tutto sommato, sembra essere un problema (temporaneo) di Microsoft con i loro server.

Sono sicuro di avere del codice sorgente qualche tempo fa. Ma ora non funziona.

Modificare:

L'ho provato con varie versioni .NET, tutte con lo stesso risultato. :(


1
Bene che sarebbe molto interessante se i miei passi esatti dovrebbero lavorare (ma non fare), sarà lavorare (in futuro), e fare il lavoro (ma non oggi). Sarebbe anche stato straordinariamente frustrante, poiché ho dedicato 11 ore al problema.
Ian Boyd

2
msdl.microsoft.com sembra essere Microsoft Symbol Server
yoel halb

2
ed è di nuovo rotto
Simon_Weaver

Non sembra essere un "problema temporaneo del server", 7 anni dopo ei collegamenti sono ancora morti.
jrh


1

Nel mio caso, stavo eseguendo il debug di una vecchia applicazione WinForms .NET 2.0 e ho ricevuto il messaggio "Origine non disponibile" . Ho provato tutte le impostazioni consigliate.

Alla fine, ho ricostruito l'app per indirizzare temporaneamente .NET 4.5 e sono stato in grado di far funzionare il passaggio sorgente. Forse la mia app era troppo vecchia per il passaggio alla fonte. Un po 'sconfigge lo scopo, lo so, ma per test rapidi e sporchi funziona. Il bug che ho è ancora presente in .NET 4.5 . :)

Framework di destinazione



0

Ecco le istruzioni ufficiali https://referencesource.microsoft.com/setup.html

Configurare Visual Studio 2013 per il debug di .NET Framework

Per configurare Visual Studio 2013, procedi come segue nel menu Strumenti -> Opzioni -> Debug -> Generale:

  • Disabilita solo il mio codice
  • Disabilita le proprietà e gli operatori di passaggio
  • Disabilita richiede che i file di origine corrispondano esattamente alla versione originale
  • Abilita il passaggio all'origine di .NET framework
  • Abilita il supporto del server di origine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.