Éviter les recherches du débogueur pour les symboles non nécessaires
Dernière mise à jour :
- 27 mai 2007
Vous arrivez à un point d’arrêt intéressant lors du débogage de votre pilote, pour que le débogueur s’interrompe pendant une très longue période pendant qu’il tente de charger des symboles pour les pilotes que vous ne possédez pas et qui n’ont même pas d’importance pour la tâche de débogage en cours. Que se passe-t-il ?
Par défaut, les symboles sont chargés par le débogueur en fonction des besoins. (C’est ce qu’on appelle chargement différé de symboles ou chargement de symboles paresseux.) Le débogueur recherche des symboles chaque fois qu’il exécute une commande qui appelle l’affichage des symboles. Cela peut se produire à un point d’arrêt si vous avez défini une variable watch qui n’est pas valide dans le contexte actuel, comme un paramètre de fonction ou une variable locale qui n’existe pas dans l’image de pile actuelle, car elles deviennent non valides lorsque le contexte change. Cela peut également se produire si vous tapez simplement mal un nom de symbole ou exécutez une commande de débogueur non valide. Le débogueur commence à rechercher un symbole correspondant.
Pourquoi cela prend-il parfois si longtemps ? Cela dépend si le nom du symbole est qualifié ou non qualifié. Un nom de symbole qualifié est précédé du nom du module qui contient le symbole, par exemple myModule !myVar. Un nom de symbole non qualifié ne spécifie pas de nom de module, par exemple myOtherVar.
Dans le cas du nom qualifié, le débogueur recherche le symbole dans le module spécifié et, si le module n’est pas déjà chargé, charge le module (en supposant que le module existe et contient le symbole). Cela se produit assez rapidement.
Dans le cas d’un nom non qualifié, le débogueur ne « sait » pas quel module contient le symbole. Il doit donc rechercher dans tous les modules. Le débogueur vérifie d’abord tous les modules chargés pour le symbole, puis, s’il ne peut pas correspondre au symbole d’un module chargé, le débogueur poursuit sa recherche en chargeant tous les modules déchargés, en commençant par le magasin en aval et en terminant par le serveur de symboles, si vous en utilisez un. Évidemment, cela peut prendre beaucoup de temps.
Comment empêcher le chargement automatique pour les symboles non qualifiés
L’option SYMOPT_NO_UNQUALIFIED_LOADS désactive ou active le chargement automatique des modules par le débogueur lorsqu’il recherche un symbole non qualifié. Lorsque SYMOPT_NO_UNQUALIFIED_LOADS est défini et que le débogueur tente de faire correspondre un symbole non qualifié, il recherche uniquement les modules qui ont déjà été chargés et arrête la recherche lorsqu’il ne peut pas correspondre au symbole, au lieu de charger des modules déchargés pour poursuivre sa recherche. Cette option n’affecte pas la recherche de noms qualifiés.
SYMOPT_NO_UNQUALIFIED_LOADS est désactivé par défaut. Pour activer cette option, utilisez l’option de ligne de commande -snul ou, pendant l’exécution du débogueur, utilisez .symopt+0x100 ou .symopt-0x100 pour activer ou désactiver l’option, respectivement.
Pour voir l’effet de SYMOPT_NO_UNQUALIFIED_LOADS, essayez cette expérience :
- Activez le chargement de symboles bruyants (SYMOPT_DEBUG) à l’aide de l’option de ligne de commande -n ou, si le débogueur est déjà en cours d’exécution, utilisez .symopt+0x80000000 ou la commande d’extension du débogueur bruyant !sym . SYMOPT_DEBUG demande au débogueur d’afficher des informations sur sa recherche de symboles, telles que le nom de chaque module au fur et à mesure qu’il est chargé ou un message d’erreur si le débogueur ne trouve pas de fichier.
- Demandez au débogueur d’évaluer un symbole inexistant (par exemple, type ?asdasdasd). Le débogueur doit signaler de nombreuses erreurs pendant qu’il recherche le symbole inexistant.
- Activez SYMOPT_NO_UNQUALIFIED_LOADS à l’aide de .symopt+0x100.
- Répétez l’étape 2. Le débogueur doit rechercher uniquement le symbole inexistant dans les modules chargés, et il doit terminer la tâche beaucoup plus rapidement.
- Pour désactiver SYMOPT_DEBUG, utilisez .symopt-0x80000000 ou la commande d’extension du débogueur silencieux !sym .
Un certain nombre d’options sont disponibles pour contrôler la façon dont le débogueur charge et utilise les symboles. Pour obtenir la liste complète des options de symbole et leur utilisation, consultez « Définition des options de symbole » dans la documentation en ligne fournie avec Les outils de débogage pour Windows. La dernière version du package Outils de débogage pour Windows est disponible en téléchargement gratuit à partir du web, ou vous pouvez installer le package à partir du DDK Windows, du KIT de développement logiciel (SDK) de plateforme ou du CD Diagnostics du support client.
Que devez-vous faire ?
- Pour accélérer la recherche de symboles, utilisez des noms qualifiés dans les points d’arrêt et les commandes du débogueur chaque fois que cela est possible. Si vous souhaitez voir un symbole d’un module connu, qualifiez-le avec le nom du module ; si vous ne savez pas où se trouve le symbole, utilisez un nom non qualifié. Pour les variables locales et les arguments de fonction, utilisez $ comme nom de module (par exemple, $ ! MyVar).
- Pour diagnostiquer les causes du chargement lent des symboles, activez le chargement de symboles bruyants (SYMOPT_DEBUG) à l’aide de l’option de ligne de commande -n ou, si le débogueur est déjà en cours d’exécution, à l’aide de .symopt+0x80000000 ou de la commande d’extension du débogueur bruyant !sym .
- Pour empêcher le débogueur de rechercher des symboles dans les modules déchargés, activez SYMOPT_NO_UNQUALIFIED_LOADS à l’aide de l’option de ligne de commande -snul ou, si le débogueur est déjà en cours d’exécution, à l’aide de .symopt+0x100.
- Pour charger explicitement les modules dont vous avez besoin pour votre session de débogage, utilisez des commandes de débogueur telles que .reload ou ld.