Partilhar via


Evitando que o depurador pesquise símbolos não necessários

Última atualização:

  • 27 de maio de 2007

Você chega a um ponto de interrupção interessante durante a depuração do driver, apenas para que o depurador pause por muito tempo enquanto ele tenta carregar símbolos para drivers que você não possui e que nem importam para a tarefa de depuração em questão. O que está havendo?

Por padrão, os símbolos são carregados pelo depurador conforme necessário. (Isso é chamado de carregamento de símbolo adiado ou carregamento de símbolo lento.) O depurador procura símbolos sempre que executa um comando que chama a exibição de símbolos. Isso pode acontecer em um ponto de interrupção se você tiver definido uma variável watch que não é válida no contexto atual, como um parâmetro de função ou variável local que não existe no quadro de pilha atual, pois elas se tornam inválidas quando o contexto é alterado. Isso também pode acontecer se você simplesmente digitar incorretamente um nome de símbolo ou executar um comando de depurador inválido– o depurador começará a procurar um símbolo correspondente.

Por que isso às vezes leva tanto tempo? Isso depende se o nome do símbolo é qualificado ou não qualificado. Um nome de símbolo qualificado é precedido com o nome do módulo que contém o símbolo, por exemplo, myModule!myVar. Um nome de símbolo não qualificado não especifica um nome de módulo, por exemplo, myOtherVar.

No caso do nome qualificado, o depurador procura o símbolo no módulo especificado e, se o módulo ainda não estiver carregado, carrega o módulo (supondo que o módulo exista e contenha o símbolo). Isso acontece muito rapidamente.

No caso de um nome não qualificado, o depurador não "sabe" qual módulo contém o símbolo, portanto, ele deve procurar em todos eles. O depurador primeiro verifica todos os módulos carregados para o símbolo e, se ele não puder corresponder ao símbolo em qualquer módulo carregado, o depurador continuará sua pesquisa carregando todos os módulos descarregados, começando com o repositório downstream e terminando com o servidor de símbolos, se você estiver usando um. Obviamente, isso pode levar muito tempo.

Como impedir o carregamento automático para símbolos não qualificados

A opção SYMOPT_NO_UNQUALIFIED_LOADS desabilita ou habilita o carregamento automático de módulos do depurador quando ele pesquisa um símbolo não qualificado. Quando SYMOPT_NO_UNQUALIFIED_LOADS é definido e o depurador tenta corresponder a um símbolo não qualificado, ele pesquisa apenas módulos que já foram carregados e para de pesquisar quando não pode corresponder ao símbolo, em vez de carregar módulos descarregados para continuar sua pesquisa. Essa opção não afeta a pesquisa de nomes qualificados.

SYMOPT_NO_UNQUALIFIED_LOADS está desativado por padrão. Para ativar essa opção, use a opção de linha de comando -snul ou, enquanto o depurador estiver em execução, use .symopt+0x100 ou .symopt-0x100 para ativar ou desativar a opção, respectivamente.

Para ver o efeito de SYMOPT_NO_UNQUALIFIED_LOADS, experimente este experimento:

  1. Ative o carregamento de símbolos barulhentos (SYMOPT_DEBUG) usando a opção de linha de comando -n ou, se o depurador já estiver em execução, use .symopt+0x80000000 ou o comando de extensão de depurador !sym noisy . SYMOPT_DEBUG instrui o depurador a exibir informações sobre sua pesquisa de símbolos, como o nome de cada módulo como ele é carregado ou uma mensagem de erro se o depurador não puder encontrar um arquivo.
  2. Instrua o depurador a avaliar um símbolo inexistente (por exemplo, digite ?asdasdasd). O depurador deve relatar vários erros enquanto pesquisa o símbolo inexistente.
  3. Ative SYMOPT_NO_UNQUALIFIED_LOADS usando .symopt+0x100.
  4. Repita a etapa 2. O depurador deve pesquisar apenas módulos carregados para o símbolo inexistente e deve concluir a tarefa muito mais rapidamente.
  5. Para desabilitar SYMOPT_DEBUG, use .symopt-0x80000000 ou o comando de extensão de depurador !sym quiet .

Várias opções estão disponíveis para controlar como o depurador carrega e usa símbolos. Para obter uma lista completa de opções de símbolo e como usá-las, consulte "Configurando opções de símbolo" na documentação online fornecida com as Ferramentas de Depuração para Windows. A versão mais recente do pacote Ferramentas de Depuração para Windows está disponível como um download gratuito da Web ou você pode instalar o pacote no DDK do Windows, no SDK da Plataforma ou no CD de Diagnóstico de Suporte ao Cliente.

O que você deve fazer?

  • Para acelerar a pesquisa de símbolos, use nomes qualificados em pontos de interrupção e comandos de depurador sempre que possível. Se você quiser ver um símbolo de um módulo conhecido, qualifique-o com o nome do módulo; se você não souber onde está o símbolo, use um nome não qualificado. Para variáveis locais e argumentos de função, use $ como o nome do módulo (por exemplo, $! MyVar).
  • Para diagnosticar as causas do carregamento lento de símbolos, ative o carregamento de símbolos barulhentos (SYMOPT_DEBUG) usando a opção de linha de comando -n ou, se o depurador já estiver em execução, usando .symopt+0x80000000 ou o comando de extensão do depurador !sym noisy .
  • Para impedir que o depurador pesquise símbolos em módulos descarregados, ative SYMOPT_NO_UNQUALIFIED_LOADS usando a opção de linha de comando -snul ou, se o depurador já estiver em execução, usando .symopt+0x100.
  • Para carregar explicitamente os módulos necessários para sua sessão de depuração, use comandos de depurador, como .reload ou ld.

Confira também

Baixe o WDK

Ferramentas de Depuração para Windows

Introdução com a Depuração do Windows