Método ICorProfilerInfo2::DoStackSnapshot
Conduz quadros gerenciado na pilha para o segmento especificado e envia informações para o criador de perfil por meio de um retorno de chamada.
HRESULT DoStackSnapshot(
[in] ThreadID thread,
[in] StackSnapshotCallback *callback,
[in] ULONG32 infoFlags,
[in] void *clientData,
[in, size_is(contextSize), length_is(contextSize)] BYTE context[],
[in] ULONG32 contextSize);
Parâmetros
thread
[in] A ID do thread-alvo.Passar nulo no thread gera um instantâneo do thread corrente. If a ThreadID de um thread diferente é passado, o common linguagem tempo de execução (CLR) suspende esse segmento, realiza o instantâneo e reinicia.
callback
[in] Um ponteiro para a implementação do StackSnapshotCallback método, que é chamado pelo CLR para fornecer o criador de perfil informações em cada quadro gerenciado e cada execução de quadros não gerenciados.The StackSnapshotCallback método é implementado pelo gravador criador de perfil.
infoFlags
[in] Um valor igual a COR_PRF_SNAPSHOT_INFO enumeração, que especifica a quantidade de dados a ser transmitido novamente para cada quadro por StackSnapshotCallback.clientData
[in] Um ponteiro para dados do cliente, que são passados diretamente para o StackSnapshotCallback função de retorno de chamada.context
[in] Um ponteiro para um Win32 CONTEXT estrutura, que é usada para propagar a movimentação da pilha. O Win32 CONTEXT estrutura contém valores de registradores de CPU e representa o estado da CPU em um determinado momento time.A semente ajuda o CLR determinar onde começar a movimentação da pilha, se a parte superior da pilha for código não gerenciado auxiliar; caso contrário, a semente é ignorada. Uma semente deve ser fornecida para uma movimentação assíncrono. Não se você estiver fazendo uma movimentação síncrono, é necessário nenhum semente.
The context o parâmetro é válido somente se o sinalizar COR_PRF_SNAPSHOT_CONTEXT foi passado a infoFlags parâmetro.
contextSize
[in] O dimensionar do CONTEXT estrutura, que faz referência a context parâmetro.
Comentários
Passar nulo para thread gera um instantâneo do thread corrente. Instantâneos podem ser criados de outro threads somente se o destino thread está suspensa no momento.
Quando o criador de perfil deseja movimentar a pilha, ele chama DoStackSnapshot. Antes do CLR retorna da telefonar, ele chama o seu StackSnapshotCallback várias vezes, uma vez para cada gerenciado quadro (ou execução de quadros não gerenciado) na pilha. Quando quadros não gerenciados são encontrados, você deve movimentá-los por conta própria.
A ordem na qual a pilha é movimentada é o inverso de como os quadros foram enviados na pilha: folha (último empurrada) quadro primeiro e principal (enviados primeiro) quadro pela última vez.
Para obter mais informações sobre como programar o criador de perfil para movimentar gerenciado pilhas, consulte Pilha do criador de perfil movimento no .NET estrutura 2.0: Noções básicas e Beyond na biblioteca MSDN.
Um exame da pilha pode ser síncrono ou assíncrono, sistema autônomo explicado sistema autônomo seções a seguintes.
síncrono pilha walk
Um exame da pilha síncronas envolve a movimentar a pilha do thread corrente em resposta a um retorno de chamada. Não há necessidade de propagação ou suspensão.
Você faz um síncrono telefonar quando, em resposta ao CLR telefonar ing, um de ICorProfilertelefonarback (or ICorProfilertelefonarback2) métodos, você telefonar DoStackSnapshot para movimentar a pilha do thread corrente. Isso é útil quando você deseja ver a aparência da pilha em uma notificação, sistema autônomo ICorProfilerCallback::ObjectAllocated. Você apenas chamar DoStackSnapshot no seu ICorProfilerCallback método, passar nulo no context e thread parâmetros.
assíncrono pilha walk
Um exame da pilha assíncrono implica a movimentar a pilha de um thread diferente ou movimentar a pilha do thread corrente, não em resposta a um retorno de chamada, mas pelo ponteiro de instrução do segmento corrente de seqüestro. Uma movimentação assíncrono requer uma semente, se a parte superior da pilha for código não gerenciado que não seja parte de uma invocação de plataforma (PInvoke) ou a telefonar COM, mas o código auxiliar no próprio CLR. Por exemplo, o código que faz just-in-time (JIT) compilar ou lixo coleção é o código auxiliar.
É obter uma semente suspendendo diretamente o destino thread e você mesmo, até encontrar o primeiro movimentar a pilha gerenciada quadro. Depois que o thread-alvo é suspensa, obter o contexto de registro corrente do thread-alvo. Em seguida, determine se o contexto de registro aponta para o código não gerenciado, chamando ICorProfilerInfo::GetFunctionFromIP — se ela retorna um FunctionID igual a zero, o quadro é o código não gerenciado. Agora, movimentar a pilha até atingir o primeiro quadro gerenciado e, em seguida, calcular o contexto de semente com base no contexto de registro para esse quadro.
De telefonarDoStackSnapshot com o contexto de sua semente para começar a movimentação de pilha assíncrono. Se você não fornecer uma semente, DoStackSnapshot pode ignorar quadros gerenciado na parte superior da pilha e, conseqüentemente, você terá um exame da pilha incompleta. Se você fornecer uma semente, ele deve apontar para compilação JIT ou nativo imagem gerador (NGen.exe)-gerado código; caso contrário, DoStackSnapshot Retorna o código de falha, CORPROF_E_STACKSNAPSHOT_UNMANAGED_CTX.
Movimentações de pilha assíncrono podem com com facilidade causar deadlocks ou acessar violações, a menos que você siga estas diretrizes:
Quando você suspende os threads diretamente, lembre-se de que somente um thread nunca executou código gerenciado pode suspender outro thread.
Sempre bloquear no seu ICorProfilerCallback::ThreadDestroyed retorno de chamada até que a movimentação de pilha do thread que está concluído.
Não segure um bloquear enquanto seu criador de perfil chama uma função CLR que pode disparar um lixo coleção. Ou seja, não segure um bloquear se o segmento proprietário pode fazer uma telefonar que dispara uma coleta de lixo.
Requisitos
Plataformas: See Requisitos de sistema do .NET framework.
Cabeçalho: CorProf.h
Biblioteca: CorProf.idl
.NET Framework Versions: 3.5 SP1, 3,5, 3.0 SP1, 3.0, 2.0 SP1, 2.0