Compartilhar via


Procedimento de desenrolamento.

A matriz de código de desenrolamento é classificada em ordem decrescente. Quando ocorre uma exceção, o contexto completo é armazenado pelo sistema operacional em um registro de contexto. A lógica de expedição de exceção é invocada, que executa repetidamente as seguintes etapas para encontrar um manipulador de exceção.

  1. Use o RIP atual armazenado no registro do contexto para pesquisar uma entrada na tabela RUNTIME_FUNCTION que descreve a função atual (ou parte da função, no caso de entradas UNWIND_INFO encadeadas).

  2. Se nenhuma entrada de tabela de função for encontrada, em seguida, ele está em uma função de folha e RSP diretamente abordará o ponteiro de retorno. O ponteiro de retorno no [RSP] é armazenado no contexto atualizado, o RSP simulado é incrementado por 8 e a etapa 1 é repetida.

  3. Se uma entrada de tabela de função for encontrada, o RIP pode estar dentro de três regiões a) em um epilog, b) no prólogo ou c) no código que pode estar coberto por um manipulador de exceção.

    • Caso um) se o RIP estiver dentro de um epilog e controle estará deixando a função, não pode haver nenhum manipulador de exceção associado a essa exceção para essa função e os efeitos do epilog devem ser continuados para calcular o contexto da função do chamador. Para determinar se o RIP dentro de um epilog, o fluxo de código a partir do RIP é examinada. Se esse fluxo de código pode corresponder a parte posterior do epilog legítimo, e em seguida, é um epilog e a parte restante do epilog é simulada, com o registro do contexto atualizado à medida que cada instrução é processado. Depois disso, é repetida a etapa 1.

    • Caso b) se o RIP se encontra no prólogo, e em seguida, o controle não tiver inserido a função, não pode haver nenhum manipulador de exceção associado a essa exceção para essa função e os efeitos de prólogo devem ser desfeitos para calcular o contexto da função do chamador. O RIP está no prólogo, se a distância desde o início da função para o RIP é menor ou igual ao tamanho de prólogo codificado em informações de desenrolamento. Os efeitos de prólogo são unwound scanning encaminhar por meio da matriz de códigos de desenrolamento da primeira entrada com um deslocamento menor ou igual ao deslocamento de RIP desde o início da função, em seguida, desfazendo o efeito de todos os itens restantes na matriz de código de desenrolamento. Etapa 1, em seguida, é repetida.

    • Caso c) se o RIP não está dentro de um prólogo ou epilog e a função possui um manipulador de exceção (UNW_FLAG_EHANDLER está definida) e, em seguida, o manipulador de idioma específico é chamado. O manipulador verifica seus dados e chamadas filtragem funções conforme apropriado. O manipulador de idioma específico pode retornar que a exceção foi tratada ou que a pesquisa deve ser continuada. Ele também pode iniciar diretamente um desenrolar.

  4. Se o manipulador específico do idioma retorna um status manipulado, em seguida, continua a execução usando o registro do contexto original.

  5. Se não há nenhum manipulador específico do idioma ou o manipulador retornará um "continuar a pesquisa" status, em seguida, o registro de contexto deve ser organizado para o estado do chamador. Isso é realizado pelo processamento de todos os elementos de matriz de código de desenrolamento, desfazendo o efeito de cada. Etapa 1, em seguida, é repetida.

Quando encadeadas desenrolar info está envolvido, estas etapas básicas ainda são seguidas. A única diferença é que, enquanto a percorrer a matriz de código de desenrolamento desenrolar efeitos do prólogo, uma vez alcançado o final da matriz, ele está vinculado às info de desenrolamento pai e a matriz inteira de desenrolamento código encontrado está sendo movimentada. Essa vinculação continua até chegar a uma informação de desenrolamento sem o sinalizador UNW_CHAINED_INFO e de término walking seu array de código de desenrolamento.

O menor conjunto de dados de desenrolamento é de 8 bytes. Isso representaria uma função que só alocados 128 bytes de pilha ou menos e possivelmente salva um registro de não-volátil. Também é o tamanho de um encadeada desenrolar a estrutura de informações para um prólogo de comprimento zero com nenhum código de desenrolamento.

Consulte também

Referência

Tratamento (x64) de exceção