2010-11-23 55 views
2

Je suis confronté à une impasse dans l'une de mes applications c (c'est un gros code) et j'ai été capable de déboguer la scène où j'ai imprimé un mutex. Il ressemble à ci-dessous -Déboguer un interblocage avec pthread mutex (linux)

  {__data = 
       {__lock = 2, 
       __count = 0, 
       __owner = 15805, 
       __nusers = 1, 
       __kind = 0, 
       __spins = 0, 
       __list = {__prev = 0x0, __next = 0x0} 
       }, 
      __size = "\002\000\000\000\000\000\000\000½=\000\000\001", '\0' <repeats 26 times>, 
      __align = 2 
     } 

Maintenant, je peux comprendre que __owner est id fil de fil tenant ce mutex, même thread se termine dans une impasse pour ce mutex. Est-ce que quelqu'un sait le sens du reste des champs tels que _ lock, _count, __ spins etc qui pourrait être utile dans le débogage deadlocks? Des conseils/astuces seraient également les bienvenus? (Basé sur le débogage, j'ai compris le thread essaye de verrouiller le mutex qu'il détient déjà, se retrouvant dans l'impasse et d'autres threads sont en attente pour ce mutex)

Est-ce aussi possible de savoir à quelle ligne de code cela a été verrouillé en observant le processus/threads à travers le débogueur (gdb) (bien sûr, les informations de débogage et le code sont à portée de main) sans nécessiter de code-walkthrough prudent de code? J'ai parcouru mon code plusieurs fois mais je n'ai pas pu trouver où ce verrou a été laissé inédit avant de revenir de la fonction.

Merci Nerdy

Répondre

-1

Les autres champs ne sont pas particulièrement utiles pour le débogage des blocages. L'information importante est ce que vous avez déjà trouvé - le thread est dans l'impasse parce qu'il verrouille un mutex qui est déjà verrouillé par lui-même.

Pour déboguer cela avec gdb, vous pouvez définir des points d'arrêt à chaque ligne où ce mutex est verrouillé par le thread d'intérêt. Chaque fois que le point d'arrêt se déclenche, continuez simplement l'exécution. Lorsque le blocage se produit, la plus récente opération de verrouillage précédente est évidemment celle qui n'a aucun déblocage correspondant.