Iterando através da saída! DumpHeap para ler o valor no deslocamento da memória
Estou tentando criar uma expressão de linha de comando WinDbg que aceite a saída do!DumpHeap
comando e para cada endereço, lê um valor de 64 bits do deslocamento0x08
após o endereço. Eu acho que isso é possível (não tenho certeza), mas todas as tentativas que fiz até agora falham com algum erro.
Eu pesquisei bastante, mas a maioria dos artigos do WinDbg mostra exemplos simples que eu posso tentar, mas minhas tentativas falham.
Eu tenho um despejo de processo de um processo de trabalho do ASP.NET. O processo tem algum crescimento de memória, mas não há um ofensor claro, então estou tentando listar vários objetos que aparecem muitas vezes na memória. Estou usando o sos.dll para as extensões WinDbg de depuração gerenciada.
Aqui está o que estou tentando fazer
.foreach(myaddress {!dumpheap -short -mt 000007fe998adea8})
{r @$t0=poi(myaddress+0x8);!do @$t0;.echo ************* myaddress}
Observe que o comando acima deve estar em uma única linha - adicionei apenas uma quebra de linha para melhor legibilidade aqui.
Para a linha acima, o WinDbg imprime este erro:Couldn't resolve error at 'myaddress+0x8);!do @$t0;.echo ************* 00000001003cb870'
.
Estou tentando percorrer todos os endereços retornados por!DumpHeap
- cada endereço deve ir para omyaddress
variável. Então, para cada endereço, estou tentando definir o$t0
registro do usuário para o valor lidomyaddress+0x8
. o!do
(!DumpObject
) despejaria o objeto nesse endereço.
Se eu correr apenas (novamente, em uma linha no WinDbg):
.foreach(myaddress {!dumpheap -short -mt 000007fe998adea8})
{!do myaddress;.echo ************* myaddress}
Recebo uma lista de despejos de objetos, mas este é um nível superior ao que eu preciso. Quero detalhar um nível mais profundamente e despejar um membro específico desses objetos de nível superior pelos quais estou interagindo.
Isso é possível ou estou no caminho errado com isso?