Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Última atualização:
- 27 de maio de 2007
Você chega a um ponto de interrupção interessante ao depurar o seu driver, apenas para ver o depurador pausar por um longo tempo enquanto tenta carregar símbolos para drivers que você não possui e que não são relevantes para a tarefa de depuração em questão. O que é que se passa?
Por padrão, os símbolos são carregados pelo depurador conforme necessário. (Isso é chamado de carregamento de símbolo diferido ou carregamento de símbolo preguiçoso.) O depurador procura símbolos sempre que executa um comando que pede a exibição de símbolos. Isso pode acontecer em um ponto de interrupção se você tiver definido uma variável de observação 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, porque eles se tornam inválidos quando o contexto muda. 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ça a procurar um símbolo correspondente.
Por que isso às vezes demora tanto? Isso depende se o nome do símbolo é qualificado ou não qualificado. Um nome de símbolo qualificado é precedido pelo 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 (assumindo que o módulo existe e contém 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, então ele deve olhar em todos eles. O depurador primeiro verifica todos os módulos carregados para o símbolo e, em seguida, se ele não puder corresponder ao símbolo em qualquer módulo carregado, o depurador continua sua pesquisa carregando todos os módulos descarregados, começando com o armazenamento downstream e terminando com o servidor de símbolos, se você estiver usando um. Obviamente, isso pode levar muito tempo.
Como evitar o carregamento automático de símbolos não qualificados
A opção SYMOPT_NO_UNQUALIFIED_LOADS desativa ou ativa o carregamento automático de módulos do depurador ao procurar 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. Esta 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, realize esta experiência:
- 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 do 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 à medida que é carregado ou uma mensagem de erro se o depurador não conseguir encontrar um arquivo.
- Instrua o depurador a avaliar um símbolo inexistente (por exemplo, digite ?asdasdasd). O depurador deve relatar vários erros enquanto procura o símbolo inexistente.
- Ative SYMOPT_NO_UNQUALIFIED_LOADS usando .symopt+0x100.
- Repita o passo 2. O depurador deve procurar apenas módulos carregados para o símbolo inexistente, e deve terminar a tarefa muito mais rápido.
- Para desativar SYMOPT_DEBUG, use o comando .symopt-0x80000000 ou o comando de extensão do 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ímbolos e como usá-las, consulte "Definindo opções de símbolo" na documentação on-line 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 na Web ou você pode instalar o pacote a partir do DDK do Windows, SDK da plataforma ou CD de diagnóstico do suporte ao cliente.
O que fazer?
- Para acelerar a pesquisa de símbolos, use nomes qualificados em pontos de interrupção e comandos do 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 sabe 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 ruidoso de símbolos (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 !sym noisy debugger extension.
- Para impedir que o depurador procure símbolos em módulos descarregados, ative o 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 do depurador, como .reload ou ld.