Skip to main content

Dump | C#

  • Dump | C#
warning

Ferramentas da Microsoft que ajuda a analisar: Link para o site

danger

O Visual Studio fornece as mesmas coisas na aba DEBUG

info

Dump é uma foto de tudo que está na memória no exato momento em que foi tirado. O tamanho do dump é de acordo com o uso de memória usada no exato momento em que foi tirado

info

Programas: WinDBG, JETBRAINS DotMemory, DebugDiag 2, JMeter

Dotnet-counters

Instalar

dotnet tool install --global dotnet-counters

Comandos

  • dotnet-counters ps -> exibe todos os processos .NET rodando
  • dotnet-counters monitor -p <PID> -> monitora o processo com o PID especificado. -p = processo
    • alt text

Dotnet-dump

Instalar

dotnet tool install --global dotnet-dump

Comandos

  • dotnet-dump ps -> exibe todos os processos .NET rodando
  • dotnet-dump collect -p <PID> -> coleta um dump do processo baseado no PID
  • dotnet-dump analyze <caminho do arquivo> -> vai abrir o arquivo e dentro da docs tem os comandos que podemos usar

📌 Guia Completo de Comandos do WinDbg


info

Comandos iniciais: !runaway -> ~<segundos_que_esta_thread>s -> !clrstack

info
procdump -ma -c 75 -s 5 -n 1 -w nome_do_processo.exe dumpfile.dmp

Explicação dos parâmetros:

  • -ma → Gera um dump completo do processo.
  • -c 75 → Define o limite de CPU como 75%.
  • -s 5 → Faz a checagem a cada 5 segundos.
  • -n 1 → Captura apenas um dump ao atingir a condição.
  • -w nome_do_processo.exe → Aguarda o processo iniciar, se ele ainda não estiver rodando.
  • dumpfile.dmp → Nome do arquivo de saída com o dump.

🛠️ Comandos Gerais

ComandoDescrição
!analyze -vRealiza análise detalhada da falha.
!analyze -hangAnalisa travamentos (hangs) em aplicações.
.logopen <arquivo>Inicia um log da sessão de depuração.
.logcloseFecha o log da sessão.
.timeExibe informações sobre o tempo de execução.
.clsLimpa a tela do depurador.
.reloadRecarrega símbolos e módulos.

🔍 Inspeção de Processos e Threads

ComandoDescrição
!process 0 0Lista todos os processos no sistema.
!process <endereço>Exibe detalhes sobre um processo específico.
!threadMostra informações sobre a thread atual.
!threadsLista todas as threads do sistema.
~Lista todas as threads do processo em análise.
~<ID> sAlterna para uma thread específica.

📌 Depuração de Pilha (Stack Trace)

ComandoDescrição
kExibe o stack trace básico.
kbStack trace com parâmetros.
kpStack trace com informações adicionais de chamada.
kvStack trace com verificações extras de otimização.

🏗️ Inspeção de Módulos e Bibliotecas

ComandoDescrição
lmLista todos os módulos carregados.
lmfLista módulos carregados com endereços de memória.
lmv m <nome>Exibe detalhes sobre um módulo específico.
!dllsLista DLLs carregadas no processo alvo.

🔑 Manipulação de Memória

ComandoDescrição
!addressExibe informações sobre endereçamento de memória.
!vadExibe a Virtual Address Descriptor (VAD).
!poolMostra informações sobre a memória de pool.
!pte <endereço>Mostra informações sobre a tabela de páginas.
dd <endereço>Exibe dados na memória como DWORDs.
dc <endereço>Exibe dados na memória como caracteres ASCII.
da <endereço>Exibe strings armazenadas na memória.
dps <endereço>Exibe ponteiros na memória.
!memusageExibe o uso da memória no momento da falha.

🛠️ Depuração de Kernel

ComandoDescrição
!kdVerifica se a depuração de kernel está ativada.
!drvobj <driver>Exibe informações sobre um driver específico.
!devnode 0 1Lista todos os dispositivos do sistema.
!irp <endereço>Exibe detalhes sobre um IRP (I/O Request Packet).
!locksLista todos os bloqueios de recursos.

🔗 Depuração de Drivers

ComandoDescrição
!drvobj <nome_do_driver>Exibe informações sobre um driver.
!devobj <nome_do_dispositivo>Exibe informações sobre um dispositivo.
!irp <endereço>Mostra detalhes sobre um IRP específico.
!object <endereço>Exibe detalhes sobre um objeto do sistema.

🏴 Análise de Blue Screen (BSOD)

ComandoDescrição
!analyze -vFornece uma análise detalhada da falha.
!bugcheckExibe detalhes do último bugcheck.
!threadMostra a thread que gerou o erro.
!driversLista todos os drivers carregados.

🔷 Depuração de Aplicações .NET (CLR)

Carregar o SOS Debugging:

.loadby sos clr

ou para versões antigas do .NET Framework:

.loadby sos mscorwks
ComandoDescrição
!clrstackExibe a pilha de chamadas do CLR.
!dumpheap -statLista todos os objetos na heap gerenciada. Esse comando mostra tudo que estava na Heap
!dumpheap -mt <MethodTable>Lista instâncias de um tipo específico.
!gcroot <endereço>Encontra referências raiz de um objeto. Esse comando entra em objetos específicos de dentro da heap
!pe <endereço>Exibe detalhes sobre um objeto.
!do <endereço>Exibe informações detalhadas de um objeto.
!dumpmt <MethodTable>Exibe informações sobre uma MethodTable.
!dumpmodule <módulo>Mostra assemblies e módulos carregados.
!threadsExibe threads gerenciadas pelo CLR.
!eeheap -gcExibe o layout da heap gerenciada.
!verifyheapVerifica a integridade do heap gerenciado.
!finalizequeueLista objetos pendentes para finalização pelo GC.
!dsoEsse comando lista os objetos gerenciados do .NET CLR que estão na pilha da thread ativa no momento da depuração.
!runawayEsse comando exibe uma lista de threads com o tempo total de CPU consumido desde o início do processo.

🛠️ Outros Comandos Úteis

ComandoDescrição
dxExibe dados estruturados do depurador.
bp <endereço>Define um breakpoint.
blLista todos os breakpoints.
bc <número>Remove um breakpoint.
.chainLista extensões carregadas.

💡 Dicas Extras

  1. Sempre use !analyze -v para uma visão detalhada da falha.
  2. Utilize lm para verificar se os símbolos dos drivers estão carregados corretamente.
  3. Combine k, kb, kp e kv para uma análise completa do stack trace.
  4. Use dx para visualizar objetos do kernel de forma estruturada.
  5. Se precisar de mais comandos para .NET, carregue SOS e explore com !help.

📌 Guia Completo do ProcDump

🔹 O que é o ProcDump?

O ProcDump é uma ferramenta da Microsoft Sysinternals usada para capturar dumps de memória de processos em execução. Ele é útil para: ✅ Diagnóstico de falhas e travamentos
✅ Identificação de uso excessivo de CPU
✅ Depuração de aplicações .NET e nativas
✅ Análise forense de processos maliciosos


📌 Instalação

1️⃣ Baixe o ProcDump no site oficial da Microsoft Sysinternals:
🔗 https://docs.microsoft.com/en-us/sysinternals/downloads/procdump
2️⃣ Extraia os arquivos para uma pasta, ex: C:\Tools\ProcDump\
3️⃣ Abra um prompt de comando (cmd) com permissões de administrador


🔹 Sintaxe Básica

procdump.exe [opções] <nome_do_processo> <arquivo_de_saida>

🛠️ Exemplo simples: Criar um dump de um processo

procdump.exe notepad.exe dump.dmp

Isso criará um dump do notepad.exe e salvará no arquivo dump.dmp.


🔥 Principais Comandos e Opções

📌 1️⃣ Captura de Dump Simples

ComandoDescrição
procdump.exe -ma <PID>Captura um dump de memória completo do processo.
procdump.exe -mp <PID>Captura um dump parcial do processo.
procdump.exe <processo>Captura um dump do processo especificado.

✅ Exemplo:

procdump.exe -ma 1234 dump.dmp

Isso cria um dump completo do processo PID 1234.


📌 2️⃣ Captura de Dump Baseada em Uso de CPU

ComandoDescrição
procdump.exe -c 80 <PID>Captura um dump quando o uso da CPU ultrapassar 80%.
procdump.exe -c 90 -n 3 <PID>Captura 3 dumps quando a CPU ultrapassar 90%.

✅ Exemplo:

procdump.exe -c 85 -n 2 chrome.exe dumps\chrome.dmp

➡ Captura 2 dumps do chrome.exe se o uso da CPU ultrapassar 85%.


📌 3️⃣ Captura de Dump Baseada em Uso de Memória

ComandoDescrição
procdump.exe -m 500 <PID>Captura um dump se o processo ultrapassar 500 MB de RAM.
procdump.exe -m 1000 -n 2 <PID>Captura 2 dumps quando o processo ultrapassar 1GB de RAM.

✅ Exemplo:

procdump.exe -m 800 firefox.exe firefox_dumps.dmp

➡ Captura um dump do Firefox quando ele usar mais de 800MB de memória.


📌 4️⃣ Captura de Dump ao Ocorrer Falha (Crash)

ComandoDescrição
procdump.exe -e <PID>Captura um dump quando o processo crashar.
procdump.exe -e 1 -t <PID>Captura um dump completo no primeiro crash do processo.

✅ Exemplo:

procdump.exe -e -t 5678 app_crash.dmp

➡ Captura um dump completo quando o processo 5678 falhar.


📌 5️⃣ Monitoramento Contínuo (Always-On)

ComandoDescrição
procdump.exe -ma -w <processo>Captura um dump sempre que o processo iniciar.
procdump.exe -e -w <processo>Captura um dump se o processo crashar e reiniciar.

✅ Exemplo:

procdump.exe -ma -w myapp.exe

➡ Sempre que myapp.exe for iniciado, um dump será criado.


📌 6️⃣ Captura de Dump para Aplicações .NET

ComandoDescrição
procdump.exe -ma -n 3 -g <PID>Captura 3 dumps quando ocorrer um Garbage Collection (GC).
procdump.exe -ma -n 2 -f "OutOfMemoryException" <PID>Captura um dump quando ocorrer uma OutOfMemoryException.

✅ Exemplo:

procdump.exe -ma -n 2 -f "System.NullReferenceException" dotnet_app.exe

➡ Captura 2 dumps quando uma NullReferenceException ocorrer no processo dotnet_app.exe.


📌 7️⃣ Análise Pós-Captura

Após capturar um dump, use WinDbg ou Visual Studio para analisá-lo:

Abrindo o dump no WinDbg:

windbg.exe -z dump.dmp

Abrindo o dump no Visual Studio: 1️⃣ Abra o Visual Studio
2️⃣ Vá em File → Open → File
3️⃣ Selecione o arquivo .dmp
4️⃣ Escolha Debug with Managed Only ou Debug with Native


🔍 Dicas Avançadas

💡 Sempre execute o ProcDump como administrador para capturar processos do sistema.
💡 Use -w para esperar pelo processo e capturar automaticamente um dump quando ele for iniciado.
💡 Combine -e com -c para capturar dumps apenas quando a CPU estiver alta e o processo falhar.


🛠 Resumo dos Comandos Mais Importantes

ComandoDescrição
procdump.exe -ma <PID>Captura um dump completo do processo.
procdump.exe -c 80 <PID>Captura um dump se a CPU ultrapassar 80%.
procdump.exe -m 500 <PID>Captura um dump se a RAM ultrapassar 500MB.
procdump.exe -e <PID>Captura um dump se o processo crashar.
procdump.exe -w <processo>Captura um dump sempre que o processo for iniciado.
procdump.exe -f "Exception"Captura um dump quando ocorrer uma exceção específica.