Partager via


Détection de blocage

La détection des interblocages surveille l’utilisation par le pilote des ressources qui doivent être verrouillées : verrous de rotation, mutex et mutex rapides. Cette option driver verifier détecte la logique du code qui a le potentiel de provoquer un blocage à un moment donné.

L’option Détection d’interblocage du vérificateur de pilotes, ainsi que l’extension du débogueur de noyau !deadlock , est un outil efficace pour s’assurer 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 blocage se produit lorsque deux threads ou plus entrent en conflit sur une ressource, de telle sorte qu’aucune exécution n’est possible.

La forme d’interblocage la plus courante 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 B des demandes Demandes verrouille A

Si les deux séquences se produisent en même temps, le thread 1 n’obtiendra jamais le verrou B, car il appartient au thread 2, et le thread 2 n’obtiendra 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 sont pas limités à deux threads et deux ressources. Les interblocages triples entre trois threads et trois verrous sont courants, et même des interblocages en cinq ou six parties se produisent occasionnellement. Ces interblocages nécessitent un certain degré de « malchance », car ils s’appuient sur un certain nombre de choses qui se produisent simultanément. Cependant, plus les acquisitions de verrous sont éloignées, plus elles deviennent 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 des 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 verrou doit être suivie même lorsqu’il n’y a pas de possibilité d’interblocage, car dans le processus de maintenance du code, il sera facile d’introduire accidentellement un blocage.

Ressources pouvant provoquer des interblocages

Les interblocages les plus ambigus sont le résultat des ressources détenues . Il s’agit notamment des verrous de rotation, des mutexes, des mutex rapides et des ERESOURCEs.

Les ressources qui sont signalées plutôt qu’acquises (comme les événements et les ports LPC) ont tendance à provoquer des interblocages beaucoup plus ambigus. Il est bien sûr possible, et trop courant, que le code utilise mal ces ressources de telle sorte que deux threads finissent par attendre indéfiniment que l’un 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 délinquant avec un degré de certitude quelconque.

L’option De détection d’interblocage du vérificateur de pilotes recherche les interblocages potentiels impliquant des verrous de rotation, des mutex et des mutex rapides. Il ne surveille pas l’utilisation d’ERESOURCEs, ni l’utilisation de ressources non propriétaires.

Effets de la détection d’interblocage

Les routines de détection d’interblocage du vérificateur de pilotes détectent les violations de la hiérarchie des verrous qui ne sont pas nécessairement simultanées. La plupart du temps, ces violations identifient les chemins de code qui se bloqueront lorsqu’ils en ont l’occasion.

Pour rechercher les interblocages potentiels, Driver Verifier crée un graphique de l’ordre d’acquisition des 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 d’accès représenteraient des violations de la hiérarchie des verrous.

Driver Verifier émet un bogue case activée lorsque l’une de ces violations est découverte. Cela se produira avant que des interblocages réels ne se produisent.

Notes

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 la hiérarchie des verrous. Un tel code est un « interblocage en attente de se produire » qui pourrait provoquer de véritables interblocages si le code est légèrement réécrit.

Lorsque la détection d’interblocage détecte une violation, elle émet des case activée 0xC4 de bogues. Le premier paramètre de ce bogue case activée indique la violation exacte. Les violations possibles sont les suivantes :

  • Deux threads ou plus impliqués dans une violation de hiérarchie de verrous

  • Thread qui tente d’acquérir exclusivement une ressource pour laquelle il est déjà un propriétaire partagé (les ressources appartenant exclusivement peuvent être acquises partagées ; les ressources partagées ne peuvent pas être acquises exclusivement).

  • Thread qui tente d’acquérir deux fois la même ressource (interblocage automatique)

  • Une ressource qui est libérée sans avoir été acquise en premier

  • Ressource qui est libérée par un thread différent de celui qui l’a acquise

  • Une ressource qui est initialisée plusieurs fois ou qui n’est pas initialisée du tout

  • Thread supprimé alors qu’il possède toujours des ressources

  • À partir de Windows 7, Driver Verifier peut prédire les blocages possibles. Par exemple, essayez d’utiliser le même KSPIN_LOCK structure de données à la fois comme verrou de rotation standard et comme verrou de rotation en file d’attente de pile.

Pour obtenir la liste des paramètres de case activée, consultez Vérification des bogues 0xC4 (DRIVER_VERIFIER_DETECTED_VIOLATION).

Surveillance de la détection des interblocages

Une fois que la détection d’interblocage a trouvé une violation, l’extension du débogueur de 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 où les verrous ont été acquis à l’origine.

Vous trouverez 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

Notes

Cette option n’est pas compatible avec le fuzzing du délai de synchronisation du noyau

Vous pouvez activer la fonctionnalité Détection de blocage pour un ou plusieurs pilotes à l’aide du Gestionnaire du vérificateur 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 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 d’indicateur. Par exemple :

    verifier /flags 0x20 /driver MyDriver.sys
    

    La fonctionnalité sera active après le prochain démarrage.

    Sur Windows Vista et les versions ultérieures de Windows, vous pouvez également activer et désactiver la détection d’interblocage sans redémarrer l’ordinateur en ajoutant le paramètre /volatile à la commande. Par exemple :

    verifier /volatile /flags 0x20 /adddriver MyDriver.sys
    

    Ce paramètre prend effet immédiatement, mais il est perdu lorsque vous arrêtez ou redémarrez l’ordinateur. Pour plus d’informations, consultez Utilisation de paramètres volatiles.

    La fonctionnalité Détection d’interblocage est également incluse dans les paramètres standard. Par exemple :

    verifier /standard /driver MyDriver.sys
    
  • Utilisation du Gestionnaire de vérificateur de pilotes

    1. Sélectionnez Créer des paramètres personnalisés (pour les développeurs de code), puis sélectionnez Suivant.

    2. Sélectionnez Sélectionner des paramètres individuels dans une liste complète.

    3. Sélectionnez (case activée) Détection d’interblocage.

La fonctionnalité Détection d’interblocage 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.