Como você habilita “Habilitar revisão de origem do .NET Framework”?

118

Atualização de 22 de fevereiro de 2013 : A entrada do Microsoft Connect tem uma observação de Alok Shriram (gerente de programa, bibliotecas de classes básicas, .NET Framework) que o problema deve ser resolvido agora. A entrada do Connect está marcada como Resolvido (Fixo) :

Este problema agora deve ser corrigido. Publicamos uma atualização para fontes de referência. Informe-nos caso seu problema ainda não tenha sido corrigido.

Ano e meio.

Links de bônus

Questão Original

Como habilito a revisão de origem do .NET Framework no Visual Studio 2010?


Nota : esta questão é uma parte de um todo maior:


O Visual Studio 2010 vem com um novo recurso:

  • Ferramentas, opções, depuração, geral, habilitar revisão de origem do .NET Framework

Captura de tela do menu de opções

Seguindo as instruções na página MSDN How to: Debug .NET Framework Source :

Para habilitar a depuração de fonte .NET Framework

  1. No menu Ferramentas , clique em Opções .

  2. Na caixa de diálogo Opções , clique na categoria Depuração .

  3. Na caixa Geral , marque as seguintes caixas de seleção:

    • Habilitar revisão de origem do .NET Framework
    • Habilitar suporte ao servidor de origem

Eu faço isso:

Captura de tela do menu de opções, destacando as opções relevantes selecionadas

Observação : você notará, como a página do MSDN observa, e como eu percebi, que a seleção de Ativar revisão de origem do .NET Framework desmarcará automaticamente ** Ativar apenas meu código (somente gerenciado). Também habilitei as mensagens de diagnóstico do suporte ao servidor de origem.

A ativação dessas opções define automaticamente um local de download do cache de símbolos para mim:

Captura de tela do menu de opções, mostrando o diretório do cache (destacado)

Nota : A entrada do Microsoft Symbol Server já está presente (e não pode ser removida).


A página do MSDN diz para carregar os símbolos:

Para carregar símbolos do Framework usando a janela Módulos

  1. Na janela Módulos , clique com o botão direito em um módulo para o qual os símbolos não foram carregados. Você pode saber se os símbolos estão carregados ou não olhando a coluna Status dos símbolos .

  2. Aponte para Carregar Símbolos de e clique em Servidores de Símbolos da Microsoft para baixar os símbolos do servidor de símbolos públicos da Microsoft ou Caminho do Símbolo para carregar de um diretório onde você tenha armazenado símbolos anteriormente.

Eu tento isso:

insira a descrição da imagem aqui

e então todos os símbolos são carregados:

Captura de tela da janela de módulos, conforme descrito acima

Eu estou sentado em um ponto de interrupção, que está prestes a chamar o código do .NET Framework:

Captura de tela do código, transcrito abaixo

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

Empurrar F11faz com que o depurador simplesmente pule para a próxima linha:

Captura de tela do código, transcrito abaixo

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);

Como habilito a revisão de origem do .NET Framework no Visual Studio 2010?


Estou sentado em um ponto de interrupção no meu código. Tento clicar duas vezes em uma função mais acima na pilha de chamadas. Isso, espero, me permitiria pular para o código .NET:

insira a descrição da imagem aqui

Exceto que não funciona: o Visual Studio me diz que não há nenhuma fonte disponível:

Captura de tela da mensagem de erro dizendo Nenhuma fonte disponível

Como habilito a revisão de origem do .NET Framework no Visual Studio 2010?


Se eu mudar para a visualização de desmontagem antes de tentar entrar no código .NET ( Depurar -> Windows -> Desmontagem ), poderei ver um callno código .NET:

Captura de tela do código

E quando o faço, acabo depurando uma desmontagem de System.Windows.Forms.ScaleControl:

Captura de tela da janela de desmontagem

O que não é o mesmo ou tão útil quanto ser capaz de entrar no código-fonte do .NET Framework.

Como habilito a revisão de origem do .NET Framework no Visual Studio 2010?


O caminho de cache de símbolo configurado em meu computador contém arquivos de cache de símbolo:

Captura de tela da lista de pastas

Portanto, ele está baixando pdbarquivos de símbolo, mas se recusando a usá-los.

Como habilito a revisão de origem do .NET Framework no Visual Studio 2010?


Leppie sugeriu que eu verificasse o Debuglog (com a janela de log de depuração aberta; caso contrário, ele não registra nada):

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

Anteriormente no log, eu o vejo carregando símbolos para System.Windows.Forms.dll:

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

insira a descrição da imagem aqui

Portanto, ele está encontrando meus símbolos, mas alegando que não conseguiu encontrá-los.

Como habilito a revisão de origem do .NET Framework no Visual Studio 2010?


Um cara da Microsoft Itália sugere desativar Exigir arquivos de origem para corresponder exatamente à versão original :

Captura de tela da janela de opções

Isso não resolveu.

Como habilito a revisão de origem do .NET Framework no Visual Studio 2010?


Foi sugerido que há um bug no servidor de origem da Microsoft para .NET Framework 4.0 . Seguindo essa sugestão, mudei o projeto para o .NET Framework 3.5 de destino :

insira a descrição da imagem aqui

Isso não resolveu.

Como habilito a revisão de origem do .NET Framework no Visual Studio 2010?


Alguém em algum lugar se perguntou se outra pessoa com o mesmo problema estava usando a versão de 64 bits do depurador . Agora, não existe uma versão de 64 bits do Visual Studio, mas eu tentei mudar meu projeto de AnyCPU para x86 (estava sendo JITed para x64), caso a Microsoft não suporte processadores de 64 bits:

insira a descrição da imagem aqui

Isso não resolveu:

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

Como habilito a revisão de origem do .NET Framework no Visual Studio 2010?


Veja também

Ian Boyd
fonte
Você verificou o código-fonte 'cache'?
leppie de
@leppie O que você quer dizer com "código-fonte 'cache'"? Se você se refere à pasta que armazena o código-fonte em cache, ela está sendo preenchida (consulte a Atualização 4 )
Ian Boyd
Sim. É possível abrir esse arquivo de origem e definir um ponto de interrupção?
leppie
1
excelente redação do problema!
andersonbd1
1
Também não funciona no VS2012. Funcionou por um dia, depois que configurei tudo e simplesmente parei de funcionar. Dois dias, dezenas de cofres, centenas de páginas da web depois, simplesmente não funciona. Ao mesmo tempo, as fontes publicadas por symbolsource.org funcionam perfeitamente.
Wiktor Zychla

Respostas:

35

Os PDBs para percorrer o código-fonte são publicados apenas para RTM e Service Packs. Como tal, quando a atualização de segurança é lançada e modifica a dll que você está tentando depurar, ela fará com que a revisão da fonte não funcione (ou seja, você obterá a mensagem "Nenhuma fonte disponível" com um esmaecido "Navegar para encontrar a fonte ").

No entanto, depois de fazer todas as configurações apropriadas, você pode usar a seguinte solução alternativa. A solução alternativa é essencialmente localizar as atualizações de segurança que causaram a alteração da dll e removê-las. Isso tem a desvantagem óbvia de ter essas atualizações de segurança removidas de sua máquina.

Gambiarra

  1. Identifique em qual dll você deseja depurar (por exemplo, System.Windows.Forms.dll)
  2. Durante a depuração, abra a janela Módulos no Visual studio e encontre a coluna Versão . Se a versão não for RTM ou Service pack, você precisará fazer o fluxo de trabalho. Normalmente, a dll RTM dirá "construído por: RTMRel". Enquanto uma dll que fazia parte de uma atualização de segurança dirá "construído por: RTMGDR". Observe o número da versão (por exemplo 4.0.30319.269 desenvolvido por: RTMGDR)
  3. Agora, queremos encontrar a atualização que criou esta versão. Faça isso pesquisando o dll e o número da versão em support.microsoft.com/kb/ Por exemplo, eu fiz a seguinte pesquisa no Google: site:support.microsoft.com/kb System.Windows.Forms.dll 4.0.30319.269
  4. A pesquisa deve gerar informações sobre uma atualização. Observe o número KB na barra de endereço. No meu exemplo, o endereço era http://support.microsoft.com/kb/2604121, então KB2604121, é o que nos interessa.
  5. Vá para Painel de Controle-> Programas e Recursos e clique em "Exibir Atualizações Instaladas"
  6. Encontre uma atualização que lista o número KB (você pode usar a pesquisa na caixa superior direita).
  7. Desinstale essa atualização.
  8. Repita esse processo para esta mesma dll até que ela volte à versão RTMRel ou SP. Por exemplo, para System.Windows.Forms.dll, tive que remover KB2686827, KB2604121, KB2518870 antes de voltar para a versão RTMRel.

Você precisará fazer isso para cada dll dentro da estrutura .NET na qual deseja depurar.

Depois de fazer isso, defina um ponto de interrupção na fonte .net (por exemplo, vá para a guia Breakpoints, diga New-> Break at Function e digite System.Windows.Forms.Form.Form) ou entre em um dos .net métodos nessa dll.

Matt smith
fonte
1
Certo, o truque é localizar os corretos para desinstalar (já que geralmente você tem muitos deles instalados e demoram um pouco para desinstalar).
Matt Smith,
Não consigo desinstalar as atualizações de segurança. É contra a política da empresa. Existe uma maneira de obter cópias de mscorlib.dll (e outros) que correspondam ao servidor Microsoft Symbols? Meu mscorlib.dll é a versão 4.0.30319.269 (RTMGDR.030319-2600). Possivelmente, eu poderia atualizar temporariamente o GAC com esta nova DLL e tentar a revisão da fonte.
kevinarpe
Provavelmente também é contra a política da minha empresa - eu apenas os reinstalo depois de terminar. Eu não acho que você poderia simplesmente instalar uma versão antiga mscorlib.dll independente das outras dlls que devem ser revertidas com ela (para que funcione corretamente). Além disso, a atualização temporária do GAC com dlls antigas seria essencialmente equivalente a desinstalar temporariamente a atualização de segurança.
Matt Smith
O provável motivo pelo qual a Microsoft não libera a fonte das atualizações de segurança é que alguém pode comparar as alterações do código, entender qual era a vulnerabilidade de segurança e criar seus próprios exploits. O que a Microsoft não percebe é que o "código-fonte" já está disponível usando ILSpy ou Relfector. Portanto, a Microsoft, por não lançar o código-fonte, não está realmente tornando ninguém mais seguro - é apenas a vida dos desenvolvedores mais difícil.
Ian Boyd
2
@IanBoyd Duvido que essa seja a motivação da MS. Eu diria que seu fluxo de trabalho simplesmente não suporta a atualização de PDBs de origem para depuração. Eles se preocupam principalmente em fechar brechas de segurança.
xanadont
6

Embora, infelizmente, haja um problema com um Microsoft, como Leppie apontou (e eu obtive o mesmo resultado, veja

deve-se notar que sua tentativa falharia de qualquer maneira, já que você referiu:

  • Microsoft Symbol Server

ao invés de:

  • referencesource.microsoft.com/symbols

Consulte a seção Perguntas frequentes / solução de problemas de Configurando o Visual Studio para depurar o código-fonte do .NET Framework

Yoel Halb
fonte
4

Eu encontrei a resposta, eu acho.

Rastreei o que estava acontecendo no Fiddler. Parece que apenas os símbolos estão disponíveis no momento, e nenhuma fonte.

Quando o VS tenta carregar os símbolos do servidor de 'fonte de referência', ele falha (404). Como isso falha, acho que não é possível mapear os arquivos de origem nesse servidor.

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

Após a falha acima, ele tenta algum servidor chamado 'msdl' onde encontra o PDB real (mas parece que este não tem informações de código-fonte).

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

Ao todo, parece ser um problema (temporário) da Microsoft com seus servidores.

Tenho certeza de que tinha algum código-fonte há algum tempo. Mas agora não está funcionando.

Editar:

Tentei com várias versões do .NET, todas com o mesmo resultado. :(

leppie
fonte
1
Bem, isso seria muito interessante se os meus passos exatos devem trabalhar (mas não), vai trabalhar (no futuro), e fazer o trabalho (mas não hoje). Também seria extremamente frustrante, pois gastei 11 horas no problema.
Ian Boyd
2
msdl.microsoft.com parece ser o Microsoft Symbol Server
yoel halb
2
e está quebrado novamente
Simon_Weaver
Não parece ser um "problema temporário do servidor", 7 anos depois e os links ainda estão mortos.
jrh,
1

No meu caso, eu estava depurando um aplicativo WinForms antigo do .NET 2.0 e recebi a mensagem "Fonte não disponível" . Tentei todas as configurações recomendadas.

Por fim, reconstruí o aplicativo para ter como alvo temporariamente o .NET 4.5 e consegui fazer a revisão de origem funcionar. Talvez meu aplicativo seja muito antigo para revisão de origem. Meio que anula o propósito, eu sei, mas para testes rápidos e sujos, funciona. O bug que tenho ainda está presente no .NET 4.5 . :)

Estrutura Alvo

Brian Chavez
fonte
0

Você pode encontrar a fonte de referência aqui, disponível para download:

Fonte de referência do .NET Framework 4.0

As fontes para WCF, WF e até 4.5 Beta / RC e muitos mais podem ser encontradas lá também:

Microsoft Referencesource NetFramework

Mare Infinitus
fonte
3
O código-fonte é inútil sem os símbolos. A menos que você goste de pesquisar um trecho específico de código; p
leppie
0

Aqui estão as instruções oficiais https://referencesource.microsoft.com/setup.html

Configure o Visual Studio 2013 para depurar o framework .NET

Para configurar o Visual Studio 2013, faça o seguinte no menu Ferramentas -> Opções -> Depuração -> Geral:

  • Desative apenas o meu código
  • Desativar as propriedades e operadores de passagem
  • Desativar exigir arquivos de origem para corresponder exatamente à versão original
  • Habilitar revisão de fonte do .NET Framework
  • Habilitar suporte ao servidor de origem
Coronel Panic
fonte