Вы должны спрашивать не о GDB, а о конкретной библиотеке pthread и используемой ОС.
Библиотека pthread реализует мьютексы в сотрудничестве с ядром через некоторый набор системных вызовов. Если его реализация мьютексов встраивает что-то, чтобы связать последний поток, удерживающий мьютекс, в структуре данных мьютекса, то вы можете использовать GDB для получения этой информации.
Возможно, ваше ядро отслеживает эту информацию. Например, в Mac OS X коллекция сценариев GDB, входящих в комплект отладки ядра kgmacros
, включает команду showallmtx
, которая будет выполнять именно то, что вы хотите. Подвох: чтобы использовать его, вы должны отлаживать ядро машины в то время, что означает, что вы должны выполнять отладку на другом компьютере.
Конечно, у вас может быть файл устройства /dev/kmem
, который позволит вам копаться в памяти ядра и получать доступ к необходимой структуре данных, при условии, что вы сможете найти его.
Но все это действительно зависит от вашей системы - вашей библиотеки pthread и ядра ОС - не от GDB.
Вы также можете попробовать создать мьютекс типа PTHREAD_MUTEX_ERRORCHECK
; это заставит pthread_mutex_lock()
вернуть EDEADLK
вместо взаимоблокировки. Затем, когда это произойдет, вы можете прерваться и получить доступ к процессу без блокировки.