2010-08-20 2 views
1

Мое приложение находится в тупике. Есть ли способ идентифицировать объекты, которые в настоящее время заблокированы (как показано ниже)?Найти заблокированные объекты


void DoWork() 
{ 
    lock(this._lockObj) 
    { 
     // Do some work 
    } 
} 
+0

Если это помогает, вы можете использовать 'Monitor.TryEnter' для оценки того, заблокирован ли один конкретный объект. – mquander

+0

dupe? http://stackoverflow.com/questions/1300199/c-anyway-to-detect-if-an-object-is-locked –

+0

Возможный дубликат [Идентифицировать поток, который содержит блокировку] (http://stackoverflow.com/questions/3523544/ident-the-thread-which-hold-the-lock) –

ответ

6

Лучший способ сделать это состоит в использовании WinDbg и расширения SOS. Он имеет команду с именем !SyncBlk, которая предоставляет именно эту информацию. Вот ссылка на краткий учебник

+0

Спасибо за информацию. УДИВИТЕЛЬНЫЕ инструменты! –

4

Если вы отладки под Visual Studio, это не так уж трудно. Вам понадобятся два окна отладки, в частности: стек вызовов и потоки. Приостановите программу, а затем в окне потока дважды щелкните по каждому потоку, чтобы найти, где он остановлен. Токи взаимоблокировки должны быть остановлены на выполнение «блокировки».

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

Смежные вопросы