Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La détection de blocage surveille l’utilisation des ressources du pilote qui doivent être verrouillées : verrous de rotation, mutex et mutex rapides. Cette option de vérificateur de pilote détecte la logique de code susceptible d’entraîner un blocage à un moment donné.
L’option de Détection de blocage de l'outil de vérification de pilotes, associée à l’extension !deadlock du débogueur du noyau, constitue un outil efficace pour garantir que votre code évite une mauvaise utilisation de ces ressources.
La détection de blocage est prise en charge uniquement dans Windows XP et les versions ultérieures de Windows.
Causes des interblocages
Un interblocage est provoqué lorsque deux threads ou plus entrent en conflit sur une ressource, de telle sorte qu’aucune exécution n’est possible.
La forme la plus courante d’interblocage se produit lorsque deux threads ou plus attendent une ressource appartenant à l’autre thread. Ceci est illustré comme suit :
| Thread 1 | Thread 2 |
|---|---|
| Prend le verrou A | Prend le verrou B |
| Verrou des requêtes B | Demandes de verrouillage A |
Si les deux séquences se produisent en même temps, le thread 1 n’obtient jamais le verrou B, car il appartient au thread 2 et le thread 2 n’obtient jamais le verrou A, car il appartient au thread 1. Au mieux, les threads impliqués s’arrêtent et, au pire, le système cesse de répondre.
Les interblocages ne se limitent pas à deux threads ni à deux ressources. Les interblocages entre trois threads et trois verrous sont fréquents, et même des interblocages à cinq ou six parties se produisent occasionnellement. Ces interblocages nécessitent un certain degré de « mauvaise chance », car ils s’appuient sur un certain nombre de choses se produisant simultanément. Toutefois, plus les acquisitions de verrous sont éloignées, plus ces acquisitions sont probables.
Des interblocages à thread unique peuvent se produire lorsqu’un thread tente de prendre un verrou qu’il possède déjà.
Le dénominateur commun parmi tous les interblocages est que la hiérarchie de verrous n’est pas respectée. Chaque fois qu’il est nécessaire d’avoir plusieurs verrous acquis à la fois, chaque verrou doit avoir une priorité claire. Si A est pris avant B à un point et B avant C à un autre, la hiérarchie est A-B-C. Cela signifie que A ne doit jamais être acquis après B ou C, et B ne doit pas être acquis après C.
La hiérarchie de verrous doit être suivie même lorsqu’il n’existe aucune possibilité d’interblocage, car dans le processus de maintenance du code, il sera facile pour un interblocage d’être introduit accidentellement.
Les ressources qui peuvent provoquer des blocages
Les interblocages les plus clairs sont causés par les ressources détenues. Il s’agit notamment de verrous de rotation, de mutex, de mutex rapides et d’ERESOURCEs.
Les ressources signalées plutôt que acquises (comme les événements et les ports LPC) ont tendance à provoquer des interblocages beaucoup plus ambigus. Il est bien sûr possible, et tout aussi courant, que le code utilise ces ressources de telle sorte que deux threads se retrouvent à attendre indéfiniment que l'autre se termine. Toutefois, étant donné que ces ressources ne appartiennent en fait à aucun thread, il n’est pas possible d’identifier le thread delinquent avec un degré de certitude quelconque.
L’option de détection de blocage du Vérificateur de Pilotes recherche des interblocages potentiels impliquant des verrous de spin, des mutex et des mutex rapides. Il ne surveille pas l'utilisation des ERESOURCEs, ni celle des ressources non possédées.
Effets de la détection d’interblocage
Les routines de détection de blocage du vérificateur de pilote recherchent des violations de hiérarchie de verrous qui ne sont pas nécessairement simultanées. La plupart du temps, ces violations identifient les chemins de code qui risquent de s'interbloquer.
Pour trouver des interblocages potentiels, Driver Verifier génère un graphique de l’ordre d’acquisition de ressources et vérifie les boucles. Si vous deviez créer un nœud pour chaque ressource et dessiner une flèche chaque fois qu’un verrou est acquis avant un autre, les boucles de chemin représentent des violations de hiérarchie de verrous.
Driver Verifier émet un écran bleu lorsqu'une de ces anomalies est détectée. Cela se produit avant que des interblocages réels ne se produisent.
Remarque
Même si les chemins de code en conflit ne peuvent jamais se produire simultanément, ils doivent toujours être réécrits s’ils impliquent des violations de hiérarchie de verrou. Ce code est un « interblocage en attente de se produire » qui peut entraîner des interblocages réels si le code est réécrit légèrement.
Lorsque la détection d’interblocage trouve une violation, elle émet une vérification des bogues 0xC4. Le premier paramètre de cette vérification de bogue indique la violation exacte. Les violations possibles sont les suivantes :
Deux threads ou plus impliqués dans une violation de hiérarchie de verrous
Un thread qui tente d’acquérir exclusivement une ressource pour laquelle il est déjà un propriétaire partagé (les ressources détenues exclusivement peuvent être acquises en mode partagé ; les ressources partagées ne peuvent pas être acquises exclusivement).
Fil d'exécution qui tente d’acquérir la même ressource deux fois (un auto-interblocage)
Ressource publiée sans avoir été acquise en premier
Ressource libérée par un thread différent de celui qui l’a acquise
Ressource initialisée plusieurs fois, ou non initialisée du tout
Un thread supprimé alors qu'il possède encore des ressources
À compter de Windows 7, le vérificateur de pilotes peut prédire les blocages possibles. Par exemple, tenter d’utiliser la même structure de données KSPIN_LOCK à la fois comme verrou de rotation standard et comme verrou de rotation avec mise en file d’arrivée.
Consultez 0xC4 de vérification des bogues (DRIVER_VERIFIER_DETECTED_VIOLATION) pour obtenir la liste des paramètres de vérification des bogues.
Surveillance de la détection d’interblocage
Une fois que la détection de blocage trouve une violation, l’extension du débogueur du noyau !deadlock peut être utilisée pour examiner exactement ce qui s’est produit. Il peut afficher la topologie de hiérarchie de verrous ainsi que les piles d’appels pour chaque thread au moment de l'acquisition initiale des verrous.
Il existe un exemple détaillé de l’extension !deadlock , ainsi que des informations générales sur les extensions de débogueur, dans la documentation du package Outils de débogage pour Windows. Pour plus d’informations, consultez Débogage Windows .
Activation de cette option
Remarque
Cette option n’est pas compatible avec le fuzzing du délai de synchronisation du noyau
Vous pouvez activer la fonctionnalité de détection de blocage pour un ou plusieurs pilotes à l’aide du Gestionnaire de Vérification de Pilotes ou de la ligne de commande Verifier.exe. Pour plus d’informations, consultez Sélection des options du vérificateur de pilote.
Sur la ligne de commande
Sur la ligne de commande, l’option De détection de blocage est représentée par Bit 5 (0x20). Pour activer la détection de blocage, utilisez une valeur d’indicateur de 0x20 ou ajoutez 0x20 à la valeur de l’indicateur. Par exemple:
verifier /flags 0x20 /driver MyDriver.sysLa fonctionnalité sera active après le démarrage suivant.
Sur Windows Vista et les versions ultérieures de Windows, vous pouvez également activer et désactiver la détection de blocage sans redémarrer l’ordinateur en ajoutant le paramètre /volatile à la commande. Par exemple:
verifier /volatile /flags 0x20 /adddriver MyDriver.sysCe paramètre est effectif immédiatement, mais est perdu lorsque vous arrêtez ou redémarrez l’ordinateur. Pour plus d’informations, consultez Utilisation des paramètres volatiles.
La fonctionnalité De détection de blocage est également incluse dans les paramètres standard. Par exemple:
verifier /standard /driver MyDriver.sysUtilisation du Gestionnaire du Vérificateur de Pilotes
Sélectionnez Créer des paramètres personnalisés (pour les développeurs de code), puis sélectionnez Suivant.
Sélectionnez Sélectionner des paramètres individuels dans une liste complète.
Sélectionnez (cochez) détection d’interblocage.
La fonctionnalité De détection de blocage est également incluse dans les paramètres standard. Pour utiliser cette fonctionnalité, dans le Gestionnaire du vérificateur de pilotes, sélectionnez Créer des paramètres standard.