Examinando um programa durante a depuração
Para examinar um programa durante a depuração, o depurador deve ser capaz de acessar os quadros de pilha gerenciada e avaliar expressões. As seções a seguir descrevem como um depurador usa o common language runtime (CLR) API de depuração para executar essas tarefas.
Acessando as pilhas de chamadas
A lista a seguir fornece uma descrição passo a passo de como um depurador acessa os quadros de pilha gerenciada. O processo de depuração deve ser interrompido para acesso a quadros de pilha.
O depurador obtém um enumerador para cadeias de pilha. As chamadas do depurador do ICorDebugThread::EnumerateChains método para o segmento para o qual pilha cadeias devem ser acessados para obter um ICorDebugChainEnum o objeto para enumerar as cadeias de pilha.
O depurador itera por meio de cadeias de pilha, chamando o ICorDebugChainEnum::Next método.
O depurador obtém um enumerador para os quadros de pilha na cadeia chamando o ICorDebugChain::EnumerateFrames método.
O depurador continua percorrer os quadros de pilha, chamando o ICorDebugFrameEnum::Next método.
Opcionalmente, o depurador obtém o endereço IP. As chamadas do depurador do ICorDebugILFrame::GetIP método para obter o endereço IP relativas ao início da função para o quadro de pilha.
Opcionalmente, o depurador obtém outras informações sobre o quadro de pilha. Por exemplo, o depurador pode chamar o ICorDebugFrame::GetFunctionToken método para obter o token de metadados para a função para o código que está executando o quadro de pilha. O depurador também pode chamar o ICorDebugCode::GetCode método para obter um objeto que representa o código que está executando o quadro de pilha.
Avaliar expressões
Expressões em código nativo não gerenciado podem ser avaliadas, usando os mesmos mecanismos que usam a depuradores convencionais.
No código gerenciado, o depurador pode avaliar uma expressão da seguinte maneira:
Analise a expressão.
Chame a API de depuração para acessar os valores das variáveis na expressão e chamar as funções na expressão.
Como alternativa, o depurador pode fazer o seguinte:
Quebrar a expressão em uma função global e a função de compilar.
Chame a API de depuração (Edit and Continue) para adicionar a função global.
Chame a API de depuração para avaliar a função.
A lista a seguir fornece uma descrição passo a passo de como um depurador avalia uma expressão. Nesse cenário, a expressão é A + MyFunc() onde A presume que está sendo depurado está em um registro e o código gerenciado código nativo.
O depurador obtém o valor de A. As chamadas do depurador do ICorDebugNativeFrame::GetLocalRegisterValue método para o quadro de pilha no qual a expressão é avaliada.
O depurador cria um objeto de avaliação chamando o ICorDebugThread::CreateEval método para o thread no qual a expressão é avaliada.
O depurador calcula o valor de MyFunc() chamando o ICorDebugEval::CallFunction método.
O depurador avalia a expressão. O depurador se aplica a dobra constante à expressão usando os valores obtidos nas duas etapas anteriores.
Consulte também
Conceitos
Visão geral de depuração do CLR