Может ли GDB отображать список мьютексов pthread, хранящихся в каждом потоке? - PullRequest
3 голосов
/ 21 октября 2010

Я подключил GDB к заблокированному приложению, написанному с помощью pthreads.Есть ~ 10 потоков, которые все заблокированы, и я хотел бы знать, какие блокировки удерживаются какими потоками.Это возможно в WinDbg с использованием SOS.dll;это возможно в GDB?

Ответы [ 3 ]

4 голосов
/ 20 июня 2013

По крайней мере в одном варианте Linux в st ++ :: mutex C ++ 11 есть член с именем __owner, который содержит идентификатор потока, который в настоящее время заблокировал мьютекс. Использование «информационных потоков» в GDB показывает номера потоков, используемые GDB, вместе с идентификаторами потоков (см. Номер «LWP»), позволяя вам переключиться на этот поток («поток N»), а затем исследовать стек вызовов («обратная трассировка»). «).

3 голосов
/ 21 октября 2010

Вы должны спрашивать не о GDB, а о конкретной библиотеке pthread и используемой ОС.

Библиотека pthread реализует мьютексы в сотрудничестве с ядром через некоторый набор системных вызовов. Если его реализация мьютексов встраивает что-то, чтобы связать последний поток, удерживающий мьютекс, в структуре данных мьютекса, то вы можете использовать GDB для получения этой информации.

Возможно, ваше ядро ​​отслеживает эту информацию. Например, в Mac OS X коллекция сценариев GDB, входящих в комплект отладки ядра kgmacros, включает команду showallmtx, которая будет выполнять именно то, что вы хотите. Подвох: чтобы использовать его, вы должны отлаживать ядро ​​машины в то время, что означает, что вы должны выполнять отладку на другом компьютере.

Конечно, у вас может быть файл устройства /dev/kmem, который позволит вам копаться в памяти ядра и получать доступ к необходимой структуре данных, при условии, что вы сможете найти его.

Но все это действительно зависит от вашей системы - вашей библиотеки pthread и ядра ОС - не от GDB.

Вы также можете попробовать создать мьютекс типа PTHREAD_MUTEX_ERRORCHECK; это заставит pthread_mutex_lock() вернуть EDEADLK вместо взаимоблокировки. Затем, когда это произойдет, вы можете прерваться и получить доступ к процессу без блокировки.

2 голосов
/ 08 ноября 2010

GDB может быть в состоянии отобразить эту информацию, но они не реализовали эту функцию: для этого требуется взаимодействие между отладчиком и библиотекой потоков, хотя библиотека libthread_db .

DBX под Solaris - по крайней мере - (как от Sun, это помогает!) Правильно реализует эту функцию (ищите Locks part)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...