2010-10-21 11 views

Répondre

3

Ce n'est pas GDB que vous devriez poser, mais plutôt la bibliothèque pthread et le système d'exploitation que vous utilisez.

La bibliothèque pthread implémente des mutex en coopération avec le noyau via un ensemble d'appels système. Si son implémentation de mutex incorpore quelque chose pour lier le dernier thread contenant le mutex dans la structure de données mutex, alors vous pouvez utiliser GDB pour obtenir cette information.

Il est possible que votre noyau suive cette information. Sous Mac OS X, par exemple, la collection de scripts GDB livrés avec le kit de débogage du noyau, kgmacros, comprend une commande showallmtx qui fera exactement ce que vous voulez. Le catch: pour l'utiliser, vous devez déboguer le noyau de la machine à ce moment-là, ce qui signifie que vous devez faire le débogage en utilisant une machine différente.

Bien sûr, vous pourriez avoir un fichier de périphérique /dev/kmem, qui vous permettrait de fouiller dans la mémoire du noyau et d'accéder à la structure de données nécessaire, à condition que vous puissiez le localiser.

Mais tout cela dépend vraiment de votre système - votre bibliothèque pthread et votre noyau OS - et non de GDB.

Vous pouvez également essayer de créer un mutex de type PTHREAD_MUTEX_ERRORCHECK; cela entraînera pthread_mutex_lock() pour retourner EDEADLK au lieu de blocage. Vous pouvez alors rompre lorsque cela se produit et s'enraciner dans votre processus non bloqué.

2

GDB pourrait pouvoir afficher ces informations, mais ils n'ont pas mettre en œuvre cette fonctionnalité: il faut une coopération entre le débogueur et la bibliothèque de threads, bien que la bibliothèque libthread_db.

DBX sous Solaris - au moins - (both de Sun, il aide) implémente correctement ce feature (cherchez les Serrures partie)

4

Sur au moins une saveur de Linux, C + +11 std :: mutex a un membre appelé __owner qui contient l'identifiant de thread du thread qui a actuellement le mutex verrouillé. L'utilisation de "info threads" dans gdb montre les numéros de thread utilisés par gdb avec les identifiants de threads (voir le numéro "LWP"), vous permettant de passer à ce thread ("thread N"), puis examinez la pile d'appels ("backtrace ").

Questions connexes