Partilhar via


Depurando código gerenciado usando o depurador do Windows

Você pode usar os depuradores do Windows (WinDbg, CDB e NTSD) para depurar aplicativos de destino que contêm código gerenciado. Para depurar o código gerenciado, você deve carregar a extensão de depuração do SOS (sos.dll) e um componente de acesso a dados (mscordacwks.dll).

Os depuradores do Windows são separados do depurador do Visual Studio. Para obter informações sobre a distinção entre os depuradores do Windows e o depurador do Visual Studio, consulte Depuração do Windows.

Introdução ao Código Gerenciado

O código gerenciado é executado junto com o CLR (Common Language Runtime) do Microsoft .NET. Em um aplicativo de código gerenciado, o código binário que o compilador produz está na MSIL (Linguagem Intermediária da Microsoft), que é independente de plataforma.

Quando o código gerenciado é executado, o runtime produz código nativo específico da plataforma. O processo de geração de código nativo do MSIL é chamado de compilação just-in-time (JIT). Depois que o compilador JIT tiver compilado o MSIL para um método específico, o código nativo do método permanecerá na memória. Sempre que esse método é chamado posteriormente, o código nativo é executado e o compilador JIT não precisa estar envolvido.

Você pode criar código gerenciado usando vários compiladores fabricados por uma variedade de produtores de software. Em particular, o Microsoft Visual Studio pode criar código gerenciado de várias linguagens diferentes, incluindo C#, Visual Basic, JScript e C++ com extensões gerenciadas.

O CLR não é atualizado toda vez que o .NET Framework é atualizado. Por exemplo, as versões 2.0, 3.0 e 3.5 do .NET Framework todas usam a versão 2.0 do CLR. A tabela a seguir mostra a versão e o nome do arquivo do CLR usado por cada versão do .NET Framework.

Versão do .NET Framework Versão CLR Nome do arquivo CLR
1,1 1,1 mscorwks.dll
2,0 2.0 mscorwks.dll
3,0 2,0 mscorwks.dll
3,5 2,0 mscorwks.dll
4,0 4,0 clr.dll
4.5 4,0 clr.dll

Depurando código gerenciado

Para depurar o código gerenciado, o depurador deve carregar esses dois componentes.

Nota Para todas as versões do .NET Framework, o nome do arquivo do DAC é mscordacwks.dll e o nome do arquivo da extensão de depuração do SOS é sos.dll.

Obtendo a extensão de depuração do SOS (sos.dll)

Os arquivos de extensão de depuração do SOS (sos.dll) não estão incluídos na versão atual das Ferramentas de Depuração para Windows.

Para .NET Framework versões 2.0 e posteriores, sos.dll está incluído na instalação do .NET Framework.

Para a versão 1. x do .NET Framework, sos.dll não está incluído na instalação do .NET Framework. Para obter sos.dll para .NET Framework 1.x, baixe a versão de 32 bits das Ferramentas de Depuração do Windows 7 para Windows.

As Ferramentas de Depuração do Windows 7 para Windows estão incluídas no SDK do Windows para Windows 7, que está disponível nesses dois locais:

Se você estiver executando uma versão x64 do Windows, use o ISO, para que possa especificar que deseja a versão de 32 bits do SDK. Sos.dll está incluído apenas na versão de 32 bits das Ferramentas de Depuração do Windows 7 para Windows.

Carregando mscordacwks.dll e sos.dll (depuração dinâmica)

Suponha que o depurador e o aplicativo que está sendo depurado estejam em execução no mesmo computador. Em seguida, o .NET Framework que está sendo usado pelo aplicativo é instalado no computador e está disponível para o depurador.

O depurador deve carregar uma versão do DAC que seja igual à versão do CLR que o aplicativo de código gerenciado está usando. O bitness (32 bits ou 64 bits) também deve corresponder. O DAC (mscordacwks.dll) vem com o .NET Framework. Para carregar a versão correta do DAC, anexe o depurador ao aplicativo de código gerenciado e insira este comando.

.cordll -ve -u -l

A saída deve ser semelhante a essa.

CLRDLL: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll
CLR DLL status: Loaded DLL C:\Windows\Microsoft.NET\Framework64\v4.0.30319\mscordacwks.dll

Para verificar se a versão do mscordacwks.dll corresponde à versão do CLR que o aplicativo está usando, insira um dos comandos a seguir para exibir informações sobre o módulo CLR carregado.

lmv mclr (para a versão 4.0 do CLR)

lmv mscorwks (para a versão 1.0 ou 2.0 do CLR)

A saída deve ser semelhante a essa.

start             end                 module name
000007ff`26710000 000007ff`2706e000   clr        (deferred)             
    Image path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
...

No exemplo anterior, observe que a versão do CLR (clr.dll) corresponde à versão do DAC (mscordacwks.dll): v4.0.30319. Observe também que ambos os componentes são de 64 bits.

Quando você usa .cordll para carregar o DAC, a extensão de depuração do SOS (sos.dll) pode ser carregada automaticamente. Se sos.dll não for carregado automaticamente, você poderá usar um desses comandos para carregá-lo.

.loadby sos clr (para a versão 4.0 do CLR)

.loadby sos mscorwks (para a versão 1.0 ou 2.0 do CLR)

Como alternativa ao uso de .loadby, você pode usar .load. Por exemplo, para carregar a versão 4.0 do CLR de 64 bits, você pode inserir um comando semelhante a este.

.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll

Na saída anterior, observe que a versão da extensão de depuração do SOS (sos.dll) corresponde à versão do CLR e do DAC: v4.0.30319. Observe também que todos os três componentes são de 64 bits.

Carregando mscordacwks.dll e sos.dll (arquivo de despejo)

Suponha que você use o depurador para abrir um arquivo de despejo (de um aplicativo de código gerenciado) que foi criado em outro computador.

O depurador deve carregar uma versão do DAC que seja igual à versão do CLR que o aplicativo de código gerenciado estava usando no outro computador. O bitness (32 bits ou 64 bits) também deve corresponder.

O DAC (mscordacwks.dll) vem com o .NET Framework, mas vamos supor que você não tenha a versão correta do .NET Framework instalada no computador que está executando o depurador. Você tem três opções.

  • Carregue o DAC de um servidor de símbolos. Por exemplo, você pode incluir o servidor de símbolos públicos da Microsoft no caminho do símbolo.
  • Instale a versão correta do .NET Framework no computador que está executando o depurador.
  • Obtenha a versão correta do mscordacwks.dll da pessoa que criou o arquivo de despejo (em outro computador) e copie-o manualmente para o computador que está executando o depurador.

Aqui ilustramos o uso do servidor de símbolos públicos da Microsoft.

Insira esses comandos.

.sympath+ srv\* (Adicionar servidor de símbolos ao caminho do símbolo.)

!sym barulhento

.cordll -ve -u -l

A saída será semelhante a esta.

CLRDLL: Unable to get version info for 'C:\Windows\Microsoft.NET
   \Framework64\v4.0.30319\mscordacwks.dll', Win32 error 0n87

SYMSRV:  C:\ProgramData\dbg\sym\mscordacwks_AMD64_AMD64_4.0.30319.18010.dll
   \5038768C95e000\mscordacwks_AMD64_AMD64_4.0.30319.18010.dll not found

SYMSRV:  mscordacwks_AMD64_AMD64_4.0.30319.18010.dll from 
   https://msdl.microsoft.com/download/symbols: 570542 bytes - copied         
...
SYMSRV:  C:\ProgramData\dbg\sym\SOS_AMD64_AMD64_4.0.30319.18010.dll
   \5038768C95e000\SOS_AMD64_AMD64_4.0.30319.18010.dll not found

SYMSRV:  SOS_AMD64_AMD64_4.0.30319.18010.dll from 
   https://msdl.microsoft.com/download/symbols: 297048 bytes - copied         
...
Automatically loaded SOS Extension
...

Na saída anterior, você pode ver que o depurador procurou pela primeira vez mscordacwks.dll e sos.dll no computador local em C:\Windows\Microsoft.NET e no cache de símbolos (C:\ProgramData\dbg\sym). Quando o depurador não encontrou as versões corretas dos arquivos no computador local, ele as recuperou do servidor de símbolos público.

Para verificar se a versão do mscordacwks.dll corresponde à versão do CLR que o aplicativo estava usando, insira um dos comandos a seguir para exibir informações sobre o módulo CLR carregado.

lmv -mclr (para a versão 4.0 do CLR)

lmv -mscorwks (para a versão 1.0 ou 2.0 do CLR)

A saída deve ser semelhante a essa.

start             end                 module name
000007ff`26710000 000007ff`2706e000   clr        (deferred)             
    Image path: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
...

No exemplo anterior, observe que a versão do CLR (clr.dll) corresponde à versão do produto do DAC (mscordacwks.dll): v4.0.30319. Observe também que ambos os componentes são de 64 bits.

Usando a extensão de depuração do SOS

Para verificar se a extensão de depuração do SOS foi carregada corretamente, insira o comando .chain .

0:000> .chain
Extension DLL search Path:
...
Extension DLL chain:
    C:\ProgramData\dbg\sym\SOS_AMD64_AMD64_4.0.30319.18010.dll\...
        ...
    dbghelp: image 6.13.0014.1665, API 6.2.6, built Wed Dec 12 03:02:43 2012
...

Para testar a extensão de depuração do SOS, insira !sos.help. Em seguida, tente um dos comandos fornecidos pela extensão de depuração do SOS. Por exemplo, você pode experimentar !sos. DumpDomain ou ! sos. Comando Threads .

Observações

Às vezes, um aplicativo de código gerenciado carrega mais de uma versão do CLR. Nesse caso, você deve especificar qual versão do DAC carregar. Para obter mais informações, consulte .cordll.