Evitar búsquedas de depurador para símbolos no necesarios
Última actualización:
- 27 de mayo de 2007
Llega a un punto de interrupción interesante durante la depuración del controlador, solo para que el depurador se detenga durante mucho tiempo mientras intenta cargar símbolos para los controladores que no posee y que ni siquiera importan para la tarea de depuración a mano. ¿Qué sucede?
De forma predeterminada, el depurador carga los símbolos según sea necesario. (Esto se denomina carga de símbolos diferida o carga diferida de símbolos). El depurador busca símbolos cada vez que ejecuta un comando que llama a para la presentación de símbolos. Esto puede ocurrir en un punto de interrupción si ha establecido una variable de watch que no es válida en el contexto actual, como un parámetro de función o una variable local que no existe en el marco de pila actual, porque se convierten en no válidos cuando cambia el contexto. También puede ocurrir si simplemente escribe mal un nombre de símbolo o ejecuta un comando de depurador no válido, el depurador comienza a buscar un símbolo coincidente.
¿Por qué esto tarda tanto tiempo? Depende de si el nombre del símbolo está calificado o no calificado. Un nombre de símbolo completo va precedido del nombre del módulo que contiene el símbolo; por ejemplo, myModule!myVar. Un nombre de símbolo no completo no especifica un nombre de módulo; por ejemplo, myOtherVar.
En el caso del nombre completo, el depurador busca el símbolo en el módulo especificado y, si el módulo aún no está cargado, carga el módulo (suponiendo que el módulo existe y contiene el símbolo). Esto sucede bastante rápido.
En el caso de un nombre no completo, el depurador no "sabe" qué módulo contiene el símbolo, por lo que debe buscar en todos ellos. El depurador comprueba primero todos los módulos cargados para el símbolo y, a continuación, si no puede coincidir con el símbolo de cualquier módulo cargado, el depurador continúa su búsqueda cargando todos los módulos descargados, empezando por el almacén de bajada y terminando con el servidor de símbolos, si usa uno. Obviamente, esto puede tardar mucho tiempo.
Cómo evitar la carga automática de símbolos no completos
La opción SYMOPT_NO_UNQUALIFIED_LOADS deshabilita o habilita la carga automática del depurador de módulos cuando busca un símbolo no completo. Cuando se establece SYMOPT_NO_UNQUALIFIED_LOADS y el depurador intenta coincidir con un símbolo no completo, busca solo los módulos que ya se han cargado y detiene la búsqueda cuando no puede coincidir con el símbolo, en lugar de cargar módulos descargados para continuar su búsqueda. Esta opción no afecta a la búsqueda de nombres calificados.
SYMOPT_NO_UNQUALIFIED_LOADS está desactivado de forma predeterminada. Para activar esta opción, use la opción de línea de comandos -snul o, mientras se ejecuta el depurador, use .symopt+0x100 o .symopt-0x100 para activar o desactivar la opción, respectivamente.
Para ver el efecto de SYMOPT_NO_UNQUALIFIED_LOADS, pruebe este experimento:
- Active la carga de símbolos ruidosos (SYMOPT_DEBUG) mediante la opción de línea de comandos -n o, si el depurador ya está en ejecución, use .symopt+0x80000000 o el comando de extensión del depurador !sym noisy . SYMOPT_DEBUG indica al depurador que muestre información sobre su búsqueda de símbolos, como el nombre de cada módulo tal como se carga o un mensaje de error si el depurador no encuentra un archivo.
- Indique al depurador que evalúe un símbolo inexistente (por ejemplo, escriba ?asdasdasd). El depurador debe notificar numerosos errores mientras busca el símbolo inexistente.
- Active SYMOPT_NO_UNQUALIFIED_LOADS mediante .symopt+0x100.
- Repita el paso 2. El depurador solo debe buscar módulos cargados para el símbolo inexistente y debe finalizar la tarea mucho más rápido.
- Para deshabilitar SYMOPT_DEBUG, use .symopt-0x80000000 o el comando de extensión del depurador silencioso !sym .
Hay varias opciones disponibles para controlar cómo se carga el depurador y usa símbolos. Para obtener una lista completa de las opciones de símbolos y cómo usarlas, vea "Establecer opciones de símbolos" en la documentación en línea proporcionada con herramientas de depuración para Windows. La versión más reciente del paquete Herramientas de depuración para Windows está disponible como descarga gratuita desde la web, o puede instalar el paquete desde el CD de Diagnósticos de soporte técnico al cliente, Sdk de plataforma o Windows DDK.
¿Qué tiene que hacer?
- Para acelerar la búsqueda de símbolos, use nombres completos en puntos de interrupción y comandos del depurador siempre que sea posible. Si desea ver un símbolo de un módulo conocido, califique con el nombre del módulo; Si no sabe dónde está el símbolo, use un nombre no completo. Para variables locales y argumentos de función, use $ como nombre del módulo (por ejemplo, $! MyVar).
- Para diagnosticar las causas de la carga lenta de símbolos, active la carga de símbolos ruidosos (SYMOPT_DEBUG) mediante la opción de línea de comandos -n o, si el depurador ya está en ejecución, mediante .symopt+0x80000000 o el comando de extensión del depurador !sym noisy .
- Para evitar que el depurador busque símbolos en módulos descargados, active SYMOPT_NO_UNQUALIFIED_LOADS mediante la opción de línea de comandos -snul o, si el depurador ya está en ejecución, mediante .symopt+0x100.
- Para cargar explícitamente los módulos que necesita para la sesión de depuración, use comandos del depurador como .reload o ld.