Extensão de depuração do SOS

A Extensão de Depuração do SOS permite exibir informações sobre o código em execução dentro do runtime do .NET Core, tanto em processos dinâmicos quanto em despejos. A extensão é pré-instalada com dotnet-dump e Windbg/dbg e pode ser baixada para uso com LLDB. Você pode usar a Extensão de Depuração do SOS para:

  • Colete informações sobre o heap gerenciado.
  • Procure por corrupções do heap.
  • Visualize tipos de dados internos usados pelo runtime.
  • Exiba informações sobre todo o código gerenciado em execução dentro do runtime.

Sintaxe

Windows

![command] [options]

Linux e macOS

sos [command] [options]

Muitos dos comandos têm alias ou atalhos em lldb:

clrstack [options]

Comandos

A tabela de comandos a seguir também está disponível em Ajuda ou soshelp. Também é possível obter ajuda específica sobre o comando usando soshelp <command>.

Comando Descrição
bpmd [-nofuturemodule] [<nome do módulo><nome do método>] [-md<MethodDesc>] -list-clear<número do 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] [-f] [-r] [-all] 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 do SOS não consegue recuperar nomes locais, a saída de nomes locais está no formato <endereço local>=<valor>.

A opção -a é 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 opção -f (modo completo) exibe os quadros nativos intercalando-os com os quadros gerenciados e o nome do assembly e deslocamento de função para os quadros gerenciados. Essa opção não exibe quadros nativos quando usada com dotnet-dump.

A opção -r despeja cada registro de ativação.

A opção -all despeja todas as pilhas de threads gerenciados.
COMState Lista o modelo de apartment COM para cada thread e um ponteiro Context, se disponível. Esse comando só tem suporte no Windows.
DumpArray [-start<startIndex>] [-length<length>] [-details] [-nofields] <endereço de objeto da matriz>

-ou-

DA [-start<startIndex>] [-length<length>] [-details] [-nofields] endereço do objeto de 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 -details é especificada.
DumpAsync (dumpasync) [-mt<MethodTable address>] [-type<partial type name>] [-waiting] [-roots] O DumpAsync atravessa o heap com coleta de lixo e procura objetos que representam máquinas de estado assíncronas, conforme criado quando o estado de um método assíncrono é transferido para o heap. Esse comando reconhece máquinas de estado assíncronas definidos como async void, async Task, async Task<T>, async ValueTask e async ValueTask<T>.

A saída inclui um bloco de detalhes para cada objeto da máquina de estado assíncrona encontrado. Os detalhes incluem:
– Uma linha para o tipo do objeto da máquina de estado assíncrona, incluindo o endereço da MethodTable, o endereço do objeto, o tamanho e o nome do tipo dela.
– Uma linha para o nome do tipo da máquina de estado, conforme contido no objeto.
– Uma listagem de cada campo da máquina de estado.
– Uma linha para a continuação desse objeto da máquina de estado, se um ou mais tiver sido registrado.
– Raízes GC descobertas para este objeto da máquina de estado assíncrona.
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. Como o .NET Core tem apenas um AppDomain, DumpDomain retornará apenas um objeto.
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.

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

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 o MSIL (Microsoft Intermediate Language) associado a um método gerenciado.

O MSIL dinâmico é emitido de maneira diferente do MSIL carregado com base em um assembly. O MSIL dinâmico faz referência a objetos em uma matriz de objetos gerenciados, em vez dos 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.
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.

É 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.

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 K (windbg) ou bt (lldb), juntamente com 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 de runtime 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.
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 Não há suporte no dotnet-dump.
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. Só há suporte no Windows.
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.

Só há suporte no Windows.
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. Só há suporte no Windows.
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] [-all] <endereço do objeto> 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 a fim de desmontar o quadro a que o local ou o valor do 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.

A opção -all força todas as raízes a serem exibidas em vez de apenas as raízes exclusivas.
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).
Ajuda (soshelp) [<comando>] [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. Só há suporte no Windows.
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 (ip2md) <endereço de Code> 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. Só há suporte no Windows.
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.

Há suporte apenas com Windbg.
Name2EE (name2ee) <nome do módulo><tipo ou nome do 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.

Só há suporte no Windows.
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. Há suporte apenas com Windbg.
RCWCleanupList<endereço de RCWCleanupList> Exibe a lista de runtime callable wrappers no endereço especificado que aguardam limpeza. Há suporte apenas com Windbg.
SaveModule<Endereço básico><Filename> Grava uma imagem, carregada na memória do endereço especificado, no arquivo especificado. Há suporte apenas com Windbg.
SetHostRuntime [<runtime-directory>] Esse comando define o caminho para o runtime do .NET Core a ser usado para hospedar o código gerenciado executado como parte do SOS no depurador (lldb). A versão do runtime precisa ser pelo menos a 2.1.0 (ou superior). Se houver espaços no diretório, ele precisará estar entre aspas simples (').

Normalmente, o SOS tenta encontrar um runtime instalado no .NET Core para executar seu código gerenciado automaticamente, mas esse comando estará disponível se falhar. O padrão é usar o mesmo runtime (libcoreclr) que está sendo depurado. Use esse comando se o runtime padrão que está sendo depurado não estiver funcionando o suficiente para executar o código SOS ou se a versão for menor que 2.1.0.

Se você recebeu a mensagem de erro a seguir ao executar um comando SOS, use este comando para definir o caminho como runtime do .NET Core 2.1.0 (ou superior).

(lldb) clrstack
Error: Fail to initialize CoreCLR 80004005 ClrStack failed

(lldb) sethostruntime /usr/share/dotnet/shared/Microsoft.NETCore.App/2.1.6

Você pode usar o "dotnet --info" em um shell de comando para encontrar o caminho de um runtime instalado no .NET Core.
SetSymbolServer [-ms] [-disable] [-log] [-loadsymbols] [-cache<cache-path>] [-directory<search-directory>] [-sympath<windows-symbol-path>] [<symbol-server-URL>] Habilita o suporte para download do servidor de símbolos.

A opção -ms permite o download do servidor de símbolos público da Microsoft.

A opção -disable ativa o suporte para download de símbolos.

A opção -cache<cache-path> especifica um diretório de cache de símbolos. O padrão é $HOME/.dotnet/symbolcache se não for especificado.

A opção -directory adiciona um caminho para pesquisar símbolos. Pode ser mais de um.

A opção -sympath adiciona caminhos de servidor, de cache e de diretório no formato de caminho de símbolos do Windows.

A opção -log habilita o registro em log de download de símbolos.

A opção -loadsymbols tenta baixar os símbolos nativos do .NET Core para o runtime. Com suporte no lldb e no dotnet-dump.
SOSFlush Libera um cache SOS interno.
SOSStatus [-reset] Exibe o status de SOS interno ou redefine o estado interno armazenado em cache.
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.

Há suporte apenas com Windbg.
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.
Threads (clrthreads) [-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.
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.
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. Só há suporte no Windows.
VMMap Atravessa o espaço do endereço virtual e exibe o tipo de proteção aplicado a cada região. Há suporte apenas com Windbg.
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. Há suporte apenas com Windbg.

Dotnet-Dump

Para obter uma lista de comandos do SOS disponíveis com dotnet-dump analyze, confira dotnet-dump.

Depurador do Windows

Também é possível usar a Extensão de Depuração do SOS carregando-a no depurador WinDbg/dbg e executando comandos dentro do depurador do Windows. Os comandos do SOS podem ser usados em processos dinâmicos ou despejos.

O Windbg deve carregar a extensão SOS automaticamente sempre que o processo que está sendo depurado contiver o runtime do .NET Core (coreclr.dll ou libcoreclr.so).

Depurador LLDB

Para obter instruções sobre como configurar o SOS para LLDB, confira dotnet-sos. Os comandos do SOS podem ser usados em processos dinâmicos ou despejos.

Por padrão, você pode alcançar todos os comandos do SOS inserindo: sos [command_name]. No entanto, foram adicionados alias nos comandos comuns para que você não precise do prefixo sos:

Comando Função
analyzeoom Exibe as informações do último OOM ocorrido em uma solicitação de alocação para o heap da GC.
bpmd Cria um ponto de interrupção no método gerenciado especificado do módulo designado.
clrmodules Lista os módulos gerenciados no processo.
clrstack Fornece um rastreamento de pilha apenas do código gerenciado.
clrthreads Lista os threads gerenciados que estão em execução.
clru Exibe uma desmontagem anotada de um método gerenciado.
dbgout Habilita/desabilita (-off) o log interno do SOS.
dso Exibe todos os objetos gerenciados encontradas dentro dos limites da pilha atual.
dumpalc Exibe detalhes sobre um AssemblyLoadContext colecionável para o qual o objeto especificado é carregado.
dumparray Exibe detalhes sobre uma matriz gerenciada.
dumpasync Exibe informações sobre máquina de estado assíncronas no heap com coleta de lixo.
dumpassembly Exibe detalhes sobre um assembly.
dumpclass Exibe informações sobre a estrutura EEClass no endereço especificado.
dumpconcurrentdictionary Exibe o conteúdo do dicionário simultâneo.
dumpconcurrentqueue Exibe o conteúdo da fila simultânea.
dumpdelegate Exibe informações sobre um delegado.
dumpdomain Exibe informações sobre todos os assemblies dentro de todos os AppDomains ou o especificado.
dumpgcdata Exibe informações sobre os dados da GC.
dumpgen Exibe o conteúdo do heap para a geração especificada.
dumpheap Exibe informações sobre o heap com coleta de lixo e as estatísticas de coleção sobre objetos.
dumpil Exibe o MSIL (Microsoft Intermediate Language) associado a um método gerenciado.
dumplog Grava o conteúdo de um log de estresse na memória no arquivo especificado.
dumpmd Exibe informações sobre a estrutura MethodDesc no endereço especificado.
dumpmodule Exibe informações sobre o módulo no endereço especificado.
dumpmt Exibe informações sobre a tabela do método no endereço especificado.
dumpobj Exibe informações sobre o objeto no endereço especificado.
dumpruntimetypes Localiza todos os objetos System.RuntimeType no heap da GC e imprime o nome do tipo e MethodTable a que eles também se referem.
dumpsig Despeja a assinatura de um método ou campo especificado por <sigaddr> <moduleaddr>.
dumpsigelem Despeja um único elemento de um objeto de assinatura.
dumpstack Exibe um rastreamento de pilha nativo e gerenciado.
dumpstackobjects Exibe todos os objetos gerenciados encontradas dentro dos limites da pilha atual.
dumpvc Exibe informações sobre os campos de uma classe de valor.
eeheap Exibe informações sobre a memória de processo consumida por estruturas de dados de runtime internos.
eestack Executa dumpstack em todos os threads do processo.
eeversion Exibe informações sobre o runtime e as versões do SOS.
ehinfo Exibe os blocos de tratamento de exceções em um método com JIT.
finalizequeue Exibe todos os objetos registrados para a finalização.
findappdomain Tenta resolver o AppDomain de um objeto GC.
findroots Localiza e exibe raízes de objeto em coleções de GC.
gchandles Exibe estatísticas sobre identificadores do coletor de lixo no processo.
gcheapstat Exibe estatísticas sobre o coletor de lixo.
gcinfo Exibe a codificação JIT GC para um método.
gcroot Exibe informações sobre referências (ou raízes) para o objeto no endereço especificado.
gcwhere Exibe o local no heap de GC do endereço especificado.
histclear Libera qualquer recurso usado pela família de comandos Hist.
histinit Inicializa as estruturas de SOS com base no log de estresse salvo no elemento a ser depurado.
histobj 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 Exibe todas as entradas de log que fazem referência ao objeto no endereço especificado.
histroot Exibe informações relacionadas a ambas as promoções e realocações da raiz especificada.
histstats Exibe as estatísticas do log de estresse.
ip2md Exibe a estrutura MethodDesc no endereço especificado no código compilado com JIT.
listnearobj Exibe o objeto anterior e posterior ao endereço especificado.
loadsymbols Carrega os símbolos do módulo nativo do .NET Core.
logging Habilita/desabilita o log interno do SOS.
name2ee Exibe as estruturas MethodTable e EEClass do tipo ou do método especificado no módulo designado.
objsize Exibe o tamanho do objeto especificado.
parallelstacks Exibe a pilha de threads mesclados de maneira semelhante ao painel 'Pilhas Paralelas' do Visual Studio.
pathto Exibe o caminho da GC de <root> para <target>.
pe Exibe e formata campos de qualquer objeto derivado da classe Exception no endereço especificado.
printexception Exibe e formata campos de qualquer objeto derivado da classe Exception no endereço especificado.
runtimes Lista os runtimes no destino ou altera o runtime padrão.
stoponcatch O processo de destino será interrompido na próxima vez que uma exceção gerenciada for capturada durante a execução.
setclrpath Define o caminho para carregar arquivos dac/dbi do coreclr. setclrpath <path>.
sethostruntime Define ou exibe o diretório de runtime do .NET Core a ser usado para executar o código gerenciado no SOS.
setsymbolserver Habilita o suporte ao servidor de símbolos.
setsostid Define o índice tid/thread do SO atual em vez de usar o que o lldb fornece. setsostid <tid> <index>.
sos Executa vários comandos de depuração do coreclr. Use a sintaxe sos <command-name> <args>. Para obter mais informações, confira "soshelp".
soshelp Exibe todos os comandos disponíveis quando nenhum parâmetro é especificado ou exibe informações detalhadas sobre o comando especificado: soshelp <command>.
syncblk Exibe as informações do titular do SyncBlock.
taskstate Exibe um estado de tarefa em um formato legível por humanos.
threadpool Exibe informações sobre o pool de threads de runtime.
threadpoolqueue Exibe itens de trabalho do pool de threads enfileirados.
threadstate O pretty imprime o significado de um estado de threads.
timerinfo Exibe informações sobre a execução de temporizadores.
token2ee Exibe a estrutura MethodTable e a estrutura MethodDesc para o token e o módulo especificados.
traverseheap Grava informações do heap em um arquivo em um formato compreendido pelo do criador de perfil do CLR.
verifyheap Verifica se há sinais de corrupção no heap do GC.
verifyobj Verifica o objeto passado como um argumento em busca de sinais de corrupção.

Uso do exemplo de windbg/cdb

Comando Descrição
!dumparray -start 2 -length 5 -details 00ad28d0 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.
!dumpassembly 1ca248 Exibe o conteúdo de um assembly no endereço 1ca248.
!dumpheap Exibe informações sobre o heap do coletor de lixo.
!DumpLog Grava o conteúdo do log de estresse na memória em um arquivo (padrão) chamado StressLog.txt no diretório atual.
!dumpmd 902f40 Exibe a estrutura MethodDesc no endereço 902f40.
!dumpmodule 1caa50 Exibe informações sobre um módulo no endereço 1caa50.
!DumpObj a79d40 Exibe informações sobre um objeto no endereço a79d40.
!DumpVC 0090320c 00a79d9c Exibe os campos de uma classe de valor no endereço 00a79d9c usando a tabela de método no endereço 0090320c.
!eeheap -gc Exibe a memória do processo usada pelo coletor de lixo.
!finalizequeue Exibe todos os objetos programados para finalização.
!findappdomain 00a79d98 Determina o domínio do aplicativo de um objeto no endereço 00a79d98.
!gcinfo 5b68dbb8 Exibe todos os identificadores do coletor de lixo no processo atual.
!name2ee unittest.exe MainClass.Main Exibe as estruturas MethodTable e EEClass do método Main na classe MainClass do módulo unittest.exe.
!token2ee unittest.exe 02000003 Exibe informações sobre o token de metadados no endereço 02000003 do módulo unittest.exe.

Exemplo de uso do LLDB

Comando Descrição
dumparray -start 2 -length 5 -details 00ad28d0 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.
dumpassembly 1ca248 Exibe o conteúdo de um assembly no endereço 1ca248.
dumpheap Exibe informações sobre o heap do coletor de lixo.
dumplog Grava o conteúdo do log de estresse na memória em um arquivo (padrão) chamado StressLog.txt no diretório atual.
dumpmd 902f40 Exibe a estrutura MethodDesc no endereço 902f40.
dumpmodule 1caa50 Exibe informações sobre um módulo no endereço 1caa50.
dumpobj a79d40 Exibe informações sobre um objeto no endereço a79d40.
dumpvc 0090320c 00a79d9c Exibe os campos de uma classe de valor no endereço 00a79d9c usando a tabela de método no endereço 0090320c.
eeheap -gc Exibe a memória do processo usada pelo coletor de lixo.
findappdomain 00a79d98 Determina o domínio do aplicativo de um objeto no endereço 00a79d98.
gcinfo 5b68dbb8 Exibe todos os identificadores do coletor de lixo no processo atual.
name2ee unittest.exe MainClass.Main Exibe as estruturas MethodTable e EEClass do método Main na classe MainClass do módulo unittest.exe.
token2ee unittest.exe 02000003 Exibe informações sobre o token de metadados no endereço 02000003 do módulo unittest.exe.
clrthreads Exibe os threads gerenciados.

Confira também