SOS.dll (extensão de depuração SOS)

Importante

Este artigo diz respeito à versão do .NET Framework da extensão de depuração SOS. Para obter informações sobre a versão mais recente do .NET (Core) da ferramenta, consulte Extensão de depuração SOS.

A extensão de depuração SOS (SOS.dll) ajuda a depurar programas gerenciados no Visual Studio e no depurador do Windows (WinDbg.exe) fornecendo informações sobre o ambiente CLR (Common Language Runtime) interno. Essa ferramenta exige que o projeto tenha depuração não gerenciada habilitada. O SOS.dll é instalado automaticamente com o .NET Framework. Para usar SOS.dll no Visual Studio, instale o WDK (Kit de Driver do Windows).

Sintaxe

![command] [options]

Comandos

Comando Descrição
AnalyzeOOM (ao) Exibe as informações do último erro de OOM (memória insuficiente) ocorrido em uma solicitação de alocação para o heap da coleta de lixo. (Na coleta de lixo do servidor, ele exibirá OOM, se houver, em cada heap da coleta de lixo.)
BPMD [-nofuturemodule] [<nome do módulo><nome do método>] [-md<MethodDesc>] -list-clear<número de ponto de interrupção pendente>-clearall Cria um ponto de interrupção no método especificado do módulo especificado.

Se o módulo e o método especificados não forem carregados, esse comando aguardará uma notificação de que o módulo foi carregado e compilado JIT (just-in-time) antes de criar um ponto de interrupção.

É possível gerenciar a lista dos pontos de interrupção pendentes usando as opções -list, -clear e -clearall:

A opção -list gerencia uma lista de todos os pontos de interrupção pendentes. Se um ponto de interrupção pendente tiver uma ID de módulo diferente de zero, esse ponto de interrupção será específico de uma função nesse módulo carregado em especial. Se o ponto de interrupção pendente tiver uma ID de módulo zero, esse ponto de interrupção se aplicará aos módulos que ainda não foram carregados.

Use a opção -clear ou -clearall para remover os pontos de interrupção pendentes da lista.
CLRStack [-a] [-l] [-p] [-n] Fornece um rastreamento de pilha apenas do código gerenciado.

A opção -p mostra argumentos para a função gerenciada.

A opção -l mostra informações sobre as variáveis locais em um quadro. Como a Extensão de Depuração SOS não consegue recuperar nomes locais, a saída de nomes locais está no formato <endereço local>=<valor>.

A opção -a(all) é um atalho para -l e -p combinados.

A opção -n desabilita a exibição dos nomes de arquivo de origem e dos números de linha. Se o depurador tiver a opção SYMOPT_LOAD_LINES especificada, o SOS pesquisará os símbolos de cada quadro gerenciado e, se bem-sucedido, exibirá o nome do arquivo de origem e o número da linha correspondentes. O parâmetro -n (sem números de linha) pode ser especificado para desabilitar esse comportamento.

A Extensão de Depuração do SOS não exibe quadros de transição em plataformas com base em x64 e IA-64.
COMState Lista o modelo de apartment COM para cada thread e um ponteiro Context, se disponível.
DumpArray [-start<startIndex>] [-length<length>] [-details] [-nofields] <endereço de objeto da matriz>

-ou-

DA [-start<startIndex>] [-length<length>] [-detail] [-nofields] endereço de objeto da matriz>
Examina elementos de um objeto da matriz.

A opção -start especifica o índice inicial no qual os elementos são exibidos.

A opção -length especifica quantos elementos devem ser mostrados.

A opção -details exibe detalhes do elemento usando os formatos DumpObj e DumpVC.

A opção -nofields impede que as matrizes sejam exibidas. Essa opção só está disponível quando a opção -detail é especificada.
DumpAssembly<endereço do assembly> Exibe informações sobre um assembly.

O comando DumpAssembly lista vários módulos, se existirem.

É possível obter um endereço de assembly usando o comando DumpDomain.
DumpClass<endereço do EEClass> Exibe informações sobre a estrutura EEClass associada a um tipo.

O comando DumpClass exibe valores de campo estáticos, mas não exibe valores de campo não estáticos.

Use o comando DumpMT, DumpObj, Name2EE ou Token2EE para obter um endereço da estrutura do EEClass.
DumpDomain [<endereço do domínio>] Enumera cada objeto Assembly carregado no endereço do objeto AppDomain especificado. Quando chamado sem parâmetros, o comando DumpDomain lista todos os objetos AppDomain em um processo.
DumpHeap [-stat] [-strings] [-short] [-min<size>] [-max<size>] [-thinlock] [-startAtLowerBound] [-mt<MethodTable address>] [-type<partial type name>] [start [end]] Exibe informações sobre o heap com coleta de lixo e as estatísticas de coleção sobre objetos.

O comando DumpHeap exibirá um aviso se detectar fragmentação excessiva no heap do coletor de lixo.

A opção -stat restringe a saída ao resumo de tipo estatístico.

A opção -strings restringe a saída a um resumo de valor da cadeia de caracteres estatístico.

A opção -short limita a saída apenas ao endereço de cada objeto. Isso permite redirecionar facilmente do comando para outro comando do depurador para automação.

A opção -min ignora objetos menores que o parâmetro size, especificado em bytes (hex).

A opção -max ignora objetos maiores que o parâmetro size, especificado em bytes (hex).

A opção -thinlock relata ThinLocks. Para obter mais informações, consulte o comando SyncBlk.

A opção -startAtLowerBound força o exame do heap para iniciar no limite inferior de um intervalo de endereços fornecido. Durante a fase de planejamento, o heap não costuma ser examinável porque os objetos estão sendo movidos. Essa opção força DumpHeap para iniciar seu exame no limite inferior especificado. Você deve fornecer o endereço de um objeto válido como o limite inferior para que essa opção funcione. É possível exibir a memória no endereço de um objeto inválido para encontrar manualmente a próxima tabela do método. Se a coleta de lixo estiver atualmente em uma chamada para memcopy, você também poderá encontrar o endereço do próximo objeto adicionando o tamanho ao endereço inicial, fornecido como um parâmetro.

A opção -mt lista apenas os objetos que correspondem à estrutura especificada MethodTable.

A opção -type lista apenas esses objetos cujo nome do tipo é uma correspondência de subcadeia de caracteres da cadeia de caracteres especificada.

O parâmetro start inicia a listagem com base no endereço especificado.

O parâmetro end para a listagem no endereço especificado.
DumpIL<Managed DynamicMethod object> | <DynamicMethodDesc pointer> | <MethodDesc pointer> Exibe a linguagem intermediária comum (CIL) associada a um método gerenciado.

Observe que a CIL dinâmica é emitida de forma diferente da CIL que é carregada de um assembly. CIL dinâmica refere-se a objetos em uma matriz de objetos gerenciados em vez de tokens de metadados.
DumpLog [-addr<addressOfStressLog>] [<Filename>] Grava o conteúdo de um log de estresse na memória no arquivo especificado. Se você não especificar um nome, esse comando criará um arquivo chamado StressLog.txt no diretório atual.

O log de estresse na memória ajuda a diagnosticar falhas de estresse sem usar bloqueios ou E/S. Para habilitar o log de estresse, defina as seguintes chaves do Registro em HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework:

(DWORD) StressLog = 1

(DWORD) LogFacility = 0xffffffff

(DWORD) StressLogSize = 65536

A opção -addr permite especificar um log de estresse diferente do log padrão.
DumpMD<endereço de MethodDesc> Exibe informações sobre uma estrutura MethodDesc no endereço especificado.

É possível usar o comando IP2MD para obter o endereço da estrutura MethodDesc com base em uma função gerenciada.
DumpMT [-MD] <endereço de MethodTable> Exibe informações sobre uma tabela de métodos no endereço especificado. A especificação da opção -MD exibe uma lista de todos os métodos definidos com o objeto.

Cada objeto gerenciado contém um ponteiro da tabela do método.
DumpMethodSig<sigaddr><moduleaddr> Exibe informações sobre uma estrutura MethodSig no endereço especificado.
DumpModule [-mt] <endereço de Module> Exibe informações sobre um módulo no endereço especificado. A opção -mt exibe os tipos definidos em um módulo e os tipos referenciados pelo módulo

É possível usar o comando DumpDomain ou DumpAssembly para recuperar o endereço de um módulo.
DumpObj [-nofields] <endereço do objeto>

-ou-

DO<endereço do objeto>
Exibe informações sobre um objeto no endereço especificado. O comando DumpObj exibe os campos, as informações da estrutura EEClass, a tabela do método e o tamanho do objeto.

É possível usar o comando DumpStackObjects para recuperar o endereço de um objeto.

Observe que é possível executar o comando DumpObj em campos do tipo CLASS porque eles também são objetos.

A opção -nofields evita a exibição de campos do objeto e é útil para objetos como String.
DumpRuntimeTypes Exibe os objetos de tipo do runtime no heap do coletor de lixo e lista seus nomes de tipo associados e tabelas de método.
DumpStack [-EE] [-n] [topstack [bottomstack]] Exibe um rastreamento de pilha.

A opção -EE faz com que o comando DumpStack exiba apenas funções gerenciadas. Use os parâmetros top e bottom para limitar os quadros de pilha exibidos em plataformas x86.

A opção -n desabilita a exibição dos nomes de arquivo de origem e dos números de linha. Se o depurador tiver a opção SYMOPT_LOAD_LINES especificada, o SOS pesquisará os símbolos de cada quadro gerenciado e, se bem-sucedido, exibirá o nome do arquivo de origem e o número da linha correspondentes. O parâmetro -n (sem números de linha) pode ser especificado para desabilitar esse comportamento.

Em plataformas x86 e x64, o comando DumpStack cria um rastreamento de pilha detalhado.

Em plataformas com base em IA-64, o comando DumpStack imita o comando K do depurador. Os parâmetros top e bottom são ignorados em plataformas com base em IA-64.
DumpSig<sigaddr><moduleaddr> Exibe informações sobre uma estrutura Sig no endereço especificado.
DumpSigElem<sigaddr><moduleaddr> Exibe um único elemento de um objeto de assinatura. Na maioria dos casos, você deve usar DumpSig para observar objetos de assinatura individuais. No entanto, se uma assinatura tiver sido corrompida de alguma forma, será possível usar DumpSigElem para ler partes válidas dela.
DumpStackObjects [-verify] [topstack [bottomstack]]

-ou-

DSO [-verify] [topstack [bottomstack]]
Exibe todos os objetos gerenciados encontradas dentro dos limites da pilha atual.

A opção -verify valida cada campo CLASS não estático de um campo do objeto.

Use o comando DumpStackObject com comandos de rastreamento de pilha como o comando K e o comando CLRStack para determinar os valores de variáveis locais e parâmetros.
DumpVC<endereço de MethodTable><Address> Exibe informações sobre os campos de uma classe de valor no endereço especificado.

O parâmetro MethodTable permite que o comando DumpVC interprete os campos corretamente. As classes de valor não têm uma tabela de método como seu primeiro campo.
EEHeap [-gc] [-loader] Exibe informações sobre a memória de processo consumida por estruturas de dados CLR internas.

As opções -gc e -loader limitam a saída desse comando ao coletor de lixo ou a estruturas de dados do carregador.

As informações do coletor de lixo lista os intervalos de cada segmento no heap gerenciado. Se o ponteiro estiver dentro de um intervalo de segmentos indicado por -gc, o ponteiro será um ponteiro de objeto.
EEStack [-short] [-EE] Executa o comando DumpStack em todos os threads no processo.

A opção -EE é passada diretamente para o comando DumpStack. O parâmetro -short limita a saída aos seguintes tipos de threads:

Threads que tenham utilizado um bloqueio.

Threads que foram interrompidos para permitir uma coleta de lixo.

Threads que estão atualmente em código gerenciado.
EEVersion Exibe a versão do CLR.
EHInfo [<endereço de MethodDesc>] [<endereço de Code>] Exibe os blocos de tratamento de exceções em um método especificado. Este comando exibe os endereços de código e os deslocamentos do bloco de cláusula (o bloco try) e o bloco do manipulador (o bloco catch).
perguntas frequentes Exibe perguntas frequentes
FinalizeQueue [-detail] | [-allReady] [-short] Exibe todos os objetos registrados para a finalização.

A opção -detail exibe informações extras sobre todos os SyncBlocks que precisam ser limpos e todos os RuntimeCallableWrappers (RCWs) que aguardam limpeza. Ambas as estruturas de dados são armazenadas em cache e limpas pelo thread de finalizador quando é executado.

A opção -allReady exibe todos os objetos prontos para finalização, independentemente de também já estarem marcados assim pela coleta de lixo, ou serão marcado pela próxima coleta de lixo. Os objetos prontos na lista "pronta para finalização" são objetos finalizáveis que não têm mais raízes. Essa opção pode ser muito cara, porque verifica se todos os objetos nas filas finalizáveis ainda têm raízes.

A opção -short limita a saída ao endereço de cada objeto. Se for usado com -allReady, ele enumerará todos os objetos que têm um finalizador que não tem mais raiz. Se for usado independentemente, ele listará todos os objetos nas filas finalizáveis e "prontas para finalização".
FindAppDomain<endereço de Object> Determina o domínio do aplicativo de um objeto no endereço especificado.
FindRoots-gen<N> | -gen any |<endereço do objeto> Faz o depurador parar no elemento a ser depurado na próxima coleção da geração especificada. O efeito será redefinido assim que ocorrer a parada. Para parar na próxima coleção, você precisa reemitir o comando. O formulário <endereço do objeto> desse comando será usado depois que a interrupção causada por -gen ou -gen any tiver ocorrido. Nesse momento, o depurador está no estado correto de FindRoots para identificar raízes para objetos nas gerações condenadas atuais.
GCHandles [-perdomain] Exibe estatísticas sobre identificadores do coletor de lixo no processo.

A opção -perdomain organiza as estatísticas por domínio do aplicativo.

Use o comando GCHandles para encontrar perdas de memória causadas por perdas de identificador do coletor de lixo. Por exemplo, uma perda de memória ocorre quando o código mantém uma grande matriz porque um identificador do coletor de lixo forte continua apontando para ela e o identificador é descartado sem liberá-lo.
GCHandleLeaks Procura na memória referências para identificadores do coletor de lixo fortes e fixos no processo e exibe os resultados. Se um identificador for encontrado, o comando GCHandleLeaks exibirá o endereço da referência. Se um identificador não for encontrado na memória, esse comando exibirá uma notificação.
GCInfo<endereço de MethodDesc><endereço de Code> Exibe dados que indicam quando registros ou locais da pilha contêm objetos gerenciados. Se ocorrer uma coleta de lixo, o coletor deverá saber os locais de referências para objetos de forma que possa atualizá-los com novos valores de ponteiro do objeto.
GCRoot [-nostacks] <endereço de Object> Exibe informações sobre referências (ou nós) para um objeto no endereço especificado.

O comando GCRoot examina todo o heap gerenciado e a tabela do identificador para identificadores dentro de outros objetos e identificadores na pilha. Em seguida, cada pilha é pesquisada em busca de ponteiros para objetos, e a fila de finalizadores também é pesquisada.

Este comando não determina se uma raiz da pilha é válida ou se é descartada. Use os comandos CLRStack e U para desmontar o quadro a que valor de local ou argumento pertence para determinar se a raiz da pilha ainda está em uso.

A opção -nostacks restringe a pesquisa a identificadores do coletor de lixo e objetos alcançáveis.
GCWhere<endereço do objeto> Exibe o local e o tamanho no heap da coleta de lixo do argumento passado. Quando o argumento está no heap gerenciado, mas não é um endereço de objeto válido, o tamanho é exibido como 0 (zero).
help [<command>] [faq] Exibe todos os comandos disponíveis quando nenhum parâmetro é especificado ou exibe informações detalhadas sobre o comando especificado.

O parâmetro faq exibe respostas para perguntas frequentes.
HeapStat [-inclUnrooted | -iu] Exibe os tamanhos de geração para cada heap e o espaço livre total em cada geração em cada heap. Se a opção -inclUnrooted for especificada, o relatório incluirá informações sobre os objetos gerenciados do heap da coleta de lixo que não tem mais raiz.
HistClear Libera todos os recursos usados pela família de comandos Hist.

Em geral, você não precisa chamar explicitamente HistClear, porque cada HistInit limpa os recursos anteriores.
HistInit Inicializa as estruturas de SOS com base no log de estresse salvo no elemento a ser depurado.
HistObj<obj_address> Examina todos os registros de realocação do log de estresse e exibe a cadeia de realocações da coleta de lixo que podem ter levado o endereço a ser passado como um argumento.
HistObjFind<obj_address> Exibe todas as entradas de log que fazem referência a um objeto no endereço especificado.
HistRoot<root> Exibe informações relacionadas a ambas as promoções e realocações da raiz especificada.

O valor raiz pode ser usado para rastrear o movimento de um objeto por meio das coletas de lixo.
IP2MD<Code address> Exibe a estrutura MethodDesc no endereço especificado no código compilado com JIT.
ListNearObj (lno) <obj_address> Exibe os objetos anteriores e posteriores ao endereço especificado. O comando procura o endereço no heap da coleta de lixo semelhante a um início válido de um objeto gerenciado (com base em uma tabela de método válida) e o objeto posterior ao endereço do argumento.
MinidumpMode [0] [1] Impede a execução de comandos não seguros durante o uso de um minidespejo.

Passe 0 para desabilitar esse recurso ou 1 para habilitar esse recurso. Por padrão, o valor MinidumpMode é definido como 0.

Minidespejos criados com os comandos .dump /m ou .dump têm dados específicos limitados a CLR e permitem que você execute apenas um subconjunto de comandos SOS corretamente. Alguns comandos podem falhar com erros inesperados porque as áreas necessárias de memória não são mapeadas ou estão mapeadas apenas parcialmente. Essa opção evita a execução de comandos não seguros em minidespejos.
Name2EE<nome do módulo><nome do tipo ou método>

-ou-

Name2EE<nome do módulo>!<nome do tipo ou método>
Exibe a estrutura MethodTable e a estrutura EEClass do tipo ou do método especificado no módulo especificado.

O módulo especificado deve ser carregado no processo.

Para obter o nome do tipo apropriado, procure o módulo usando o Ildasm.exe (IL Disassembler). Também é possível passar * como o parâmetro de nome do módulo para pesquisar todos os módulos gerenciados carregados. O parâmetro module name também pode ser o nome do depurador para um módulo, como mscorlib ou image00400000.

Este comando dá suporte à sintaxe do depurador do Windows de <module>!<type>. O tipo deve estar totalmente qualificado.
ObjSize [<endereço do objeto>] | [-aggregate] [-stat] Exibe o tamanho do objeto especificado. Se você não especificar parâmetros, o comando ObjSize exibirá o tamanho de todos os objetos encontrados em threads gerenciados, exibirá todos os identificadores do coletor de lixo do processo e totalizará o tamanho de todos os objetos apontados por esses identificadores. O comando ObjSize inclui o tamanho de todos os objetos filho além do pai.

A opção -aggregate pode ser usada com o argumento -stat para obter uma exibição detalhada dos tipos que ainda têm raízes. Usando !dumpheap -stat e !objsize -aggregate -stat, é possível determinar quais objetos não têm mais raízes e diagnosticar diversos problemas de memória.
PrintException [-nested] [-lines] [<Endereço do objeto Exception>]

-ou-

PE [-nested] [<Endereço do objeto Exception>]
Exibe e formata campos de qualquer objeto derivado da classe Exception no endereço especificado. Se você não especificar um endereço, o comando PrintException exibirá a última exceção gerada no thread atual.

A opção -nested exibe detalhes sobre objetos de exceção aninhados.

A opção -lines exibe informações da origem, se disponível.

É possível usar esse comando para formatar e exibir o campo _stackTrace, que é uma matriz binária.
ProcInfo [-env] [-time] [-mem] Exibe variáveis de ambiente do processo, o tempo de CPU do kernel e as estatísticas de uso da memória.
RCWCleanupList<endereço de RCWCleanupList> Exibe a lista de runtime callable wrappers no endereço especificado que aguardam limpeza.
SaveModule<Endereço básico><Filename> Grava uma imagem, carregada na memória do endereço especificado, no arquivo especificado.
SOSFlush Libera um cache SOS interno.
StopOnException [-derived] [-create | -create2] <Exception><Número do pseudo-registro> Faz com que o depurador pare quando a exceção especificada é lançada, mas continua executando enquanto outras exceções são lançadas.

A opção -derived captura a exceção especificada e cada exceção derivada da exceção especificada.
SyncBlk [-all | <número de syncblk>] Exibe a estrutura SyncBlock especificada ou todas as estruturas SyncBlock. Se você não passar argumentos, o comando SyncBlk exibirá a estrutura SyncBlock correspondente aos objetos pertencentes a um thread.

Uma estrutura SyncBlock é um contêiner de informações extras que não precisa ser criada para cada objeto. Ele pode armazenar dados de interoperabilidade COM, códigos de hash e informações de bloqueio para operações thread-safe.
ThreadPool Exibe informações sobre o pool de threads gerenciados, inclusive o número de solicitações de trabalho na fila, o número de threads de porta de conclusão e o número de timers.
Token2EE<nome do módulo><token> Transforma o token de metadados especificado no módulo especificado em uma estrutura MethodTable ou na estrutura MethodDesc.

É possível passar * para o parâmetro de nome do módulo para saber para o que o token é mapeado em cada módulo gerenciado carregado. Também é possível passar o nome do depurador para um módulo como, por exemplo, mscorlib ou image00400000.
Threads [-live] [-special] Exibe todos os threads gerenciados no processo.

O comando Threads exibe a ID abreviada do depurador, a ID do thread do CLR e a ID do thread do sistema operacional. Além disso, o comando Threads exibe uma coluna Domain que indica o domínio do aplicativo no qual um thread está em execução, uma coluna APT que exibe o modo apartment COM e uma coluna Exception que exibe a última exceção gerada no thread.

A opção -live exibe threads associados a um thread dinâmico.

A opção -special exibe todos os threads especiais criados pelo CLR. Entre os threads especiais estão threads de coleta de lixo (em coleta de lixo simultânea e de servidor), threads auxiliares de depurador, threads finalizadores, threads de descarregamento AppDomain e threads de timer do pool de threads.
ThreadState <Campo do valor State> Exibe o estado do thread. O parâmetro value é o valor do campo State na saída de relatório Threads.

Exemplo:

0:003> !Threads ThreadCount: 2 UnstartedThread: 0 BackgroundThread: 1 PendingThread: 0 DeadThread: 0 Hosted Runtime: no PreEmptive GC Alloc Lock ID OSID ThreadOBJ State GC Context Domain Count APT Exception 0 1 250 0019b068 a020 Disabled 02349668:02349fe8 0015def0 0 MTA 2 2 944 001a6020 b220 Enabled 00000000:00000000 0015def0 0 MTA (Finalizer) 0:003> !ThreadState b220 Legal to Join Background CLR Owns CoInitialized In Multi Threaded Apartment
TraverseHeap [-xml] <filename> Grava informações do heap no arquivo especificado em um formato compreendido pelo do criador de perfil do CLR. A opção -xml faz o comando TraverseHeap formatar o arquivo como XML.
U [-gcinfo] [-ehinfo] [-n] <endereço de MethodDesc> | <endereço de Code> Exibe uma desmontagem anotada de um método gerenciado especificado por um ponteiro de estrutura MethodDesc para o método ou por um endereço de código dentro do corpo do método. O comando U exibe todo o método do começo ao fim, com anotações que convertem tokens de metadados em nomes.

A opção -gcinfo faz o comando U exibir a estrutura GCInfo do método.

A opção -ehinfo exibe informações sobre exceção do método. Também é possível pode obter essas informações com o comando EHInfo.

A opção -n desabilita a exibição dos nomes de arquivo de origem e dos números de linha. Se o depurador tiver a opção SYMOPT_LOAD_LINES especificada, o SOS pesquisará os símbolos de cada quadro gerenciado e, se bem-sucedido, exibirá o nome do arquivo de origem e o número da linha correspondentes. Especifique a opção -n para desabilitar esse comportamento.
VerifyHeap Verifica o heap do coletor de lixo em busca de sinais de corrupção e exibe todos os erros encontrados.

As corrupções de heap podem ser causadas por chamadas de invocação da plataforma construídas incorretamente.
VerifyObj<endereço do objeto> Verifica o objeto passado como um argumento em busca de sinais de corrupção.
VMMap Atravessa o espaço do endereço virtual e exibe o tipo de proteção aplicado a cada região.
VMStat Fornece uma exibição resumida do espaço de endereço virtual, ordenado pelo tipo de proteção aplicado a essa memória (livre, reservada, confirmada, particular, mapeada, imagem). A coluna TOTAL exibe o resultado da coluna AVERAGE multiplicada pela coluna BLK COUNT.

Comentários

A Extensão de Depuração SOS permite exibir informações sobre o código executado dentro do CLR. Por exemplo, é possível usar a Extensão de Depuração SOS para exibir informações sobre o heap gerenciado, procurar corrupções de heap, exibir tipos de dados internos usados pelo runtime e exibir informações sobre todos os códigos gerenciados em execução dentro do runtime.

Para usar a Extensão de Depuração SOS no Visual Studio, instale o WDK (Kit de Driver do Windows). Para obter informações sobre o ambiente de depuração integrado no Visual Studio, confira Ambientes de Depuração.

Também é possível usar a Extensão de Depuração SOS carregando-a no depurador WinDbg.exe e executando comandos dentro de WinDbg.exe.

Para carregar a Extensão de Depuração SOS no depurador WinDbg.exe, execute o seguinte comando na ferramenta:

.loadby sos clr

WinDbg.exe e o Visual Studio usam uma versão de SOS.dll que corresponde à versão de Mscorwks.dll atualmente em uso. Por padrão, você deve usar a versão de SOS.dll correspondente à versão atual de Mscorwks.dll.

Para usar um arquivo de despejo criado em outro computador, verifique se o arquivo Mscorwks.dll que acompanha essa instalação está no caminho do símbolo e carregue a versão correspondente de SOS.dll.

Para carregar uma versão específica de SOS.dll, digite o seguinte comando no Depurador do Windows:

.load <full path to sos.dll>

Exemplos

O comando a seguir exibe o conteúdo de uma matriz no endereço 00ad28d0. A exibição começa pelo segundo elemento e continua por mais cinco elementos.

!dumparray -start 2 -length 5 -detail 00ad28d0

O comando a seguir exibe o conteúdo de um assembly no endereço 1ca248.

!dumpassembly 1ca248

O comando a seguir exibe informações sobre o heap do coletor de lixo.

!dumpheap

O comando a seguir grava o conteúdo do log de estresse na memória em um arquivo (padrão) chamado StressLog.txt no diretório atual.

!DumpLog

O comando a seguir exibe a estrutura MethodDesc no endereço 902f40.

!dumpmd 902f40

O comando a seguir exibe informações sobre um módulo no endereço 1caa50.

!dumpmodule 1caa50

O comando a seguir exibe informações sobre um objeto no endereço a79d40.

!DumpObj a79d40

O comando a seguir exibe os campos de uma classe de valor no endereço 00a79d9c usando a tabela de método no endereço 0090320c.

!DumpVC 0090320c 00a79d9c

O comando a seguir exibe a memória do processo usada pelo coletor de lixo.

!eeheap -gc

O comando a seguir exibe todos os objetos programados para a finalização.

!finalizequeue

O comando a seguir determina o domínio do aplicativo de um objeto no endereço 00a79d98.

!findappdomain 00a79d98

O comando a seguir exibe todos os identificadores do coletor de lixo no processo atual.

!gcinfo 5b68dbb8

O comando a seguir exibe as estruturas MethodTable e EEClass do método Main na classe MainClass do módulo unittest.exe.

!name2ee unittest.exe MainClass.Main

O comando a seguir exibe informações sobre o token de metadados no endereço 02000003 do módulo unittest.exe.

!token2ee unittest.exe 02000003

Confira também