Устранение проблем с блокировкой приложений COM + - PullRequest
3 голосов
/ 03 марта 2010

Я пытаюсь устранить неполадки приложения COM +, которое периодически блокируется. В последний раз, когда он заблокировался, я смог получить дамп пользовательского режима процесса dllhost и проанализировать его с помощью WinDbg. После проверки всех потоков и блокировок все сводится к критическому разделу, принадлежащему этому потоку:

ChildEBP RetAddr  Args to Child              
0deefd00 7c822114 77e6bb08 000004d4 00000000 ntdll!KiFastSystemCallRet
0deefd04 77e6bb08 000004d4 00000000 0deefd48 ntdll!ZwWaitForSingleObject+0xc
0deefd74 77e6ba72 000004d4 00002710 00000000 kernel32!WaitForSingleObjectEx+0xac
0deefd88 75bb22b9 000004d4 00002710 00000000 kernel32!WaitForSingleObject+0x12
0deeffb8 77e660b9 000a5cc0 00000000 00000000 comsvcs!PingThread+0xf6
0deeffec 00000000 75bb21f1 000a5cc0 00000000 kernel32!BaseThreadStart+0x34

Объект, на котором он ожидает, является событием:

0:016> !handle 4d4 f
Handle 000004d4
  Type          Event
  Attributes    0
  GrantedAccess 0x1f0003:
         Delete,ReadControl,WriteDac,WriteOwner,Synch
         QueryState,ModifyState
  HandleCount   2
  PointerCount  4
  Name          <none>
  No object specific information available

Насколько я могу судить, событие никогда не получает сигнал, в результате чего поток зависает и удерживает несколько других потоков в процессе. У кого-нибудь есть предложения по дальнейшим шагам в выяснении того, что происходит?

Теперь, учитывая, что метод называется PingThread, возможно ли, что он пытается пропинговать другой поток в уже заблокированном процессе?

UPDATE
На самом деле это оказалось ошибкой в ​​клиенте Oracle 10.2.0.1. Хотя мне все еще интересны идеи о том, как я мог бы это выяснить, не найдя ошибки в базе данных ошибок Oracle.

Ответы [ 2 ]

0 голосов
/ 05 июля 2012

Вы можете использовать !locks, который попытается автоматически проанализировать взаимоблокировки, а затем сбросить стеки вызовов потоков ~* kb и проверить, какие потоки ожидают в критической секции или объектах событий.

Пример использования здесь: http://www.dumpanalysis.org/blog/index.php/2007/07/28/crash-dump-analysis-patterns-part-9c/

Кроме того, на сайте парня есть множество примеров использования WinDbg для других типов взаимоблокировок, включая управляемый код: http://www.dumpanalysis.org/ просто выполните поиск на странице «тупиковой ситуации», надеюсь, это поможет.

0 голосов
/ 03 апреля 2010

SIEExtPub может помочь вам определить блокировки в COM

А вот статья об этом

Если у вас возникли проблемы с использованием этого расширения, пожалуйста, напишите обратно

...