Как решить заморозку (или тупик) в ntdll.dll? - PullRequest
3 голосов
/ 14 марта 2011

У меня есть приложение, работающее на .Net Framework 4, и мое приложение выполняет управляемый и неуправляемый код. В неуправляемом коде используются сокеты UDP. Когда приложение запускается из Visual Studio, все в порядке, но когда оно запускается само по себе, оно часто зависает. Я видел поведение на Windows XP SP3 и Windows 7 SP1. Когда я присоединяю отладчик к приложению и приостанавливаю его, я вижу, что многие МНОГИЕ потоки застряли на одном и том же адресе памяти в ntdll.dll. При разборке выполняется команда netdll.dll «ret».

Это кому-нибудь звонит?

Похоже, ранее были похожие проблемы, такие как описанные здесь, и они были связаны с UDP: http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/1b54b2f2-6e7c-405b-bdda-62197ac8a287 Ответов не было.

Я также нашел старое исправление для аналогичной проблемы, но согласно Microsoft оно применимо только к Windows NT 4.

Любая помощь будет оценена.

1 Ответ

3 голосов
/ 14 марта 2011

Это не операционная система, которая вызывает взаимоблокировку.Да, ваша трассировка стека покажет, что она блокируется на KiFastSystemCallRet () внутри ntdll.dll.С трассировкой стека, указывающей на инструкцию RET после SYSENTER.Но он просто делает то, что вы просили сделать.

Используйте окно Debug + Windows + Threads, чтобы увидеть, что делают ваши потоки.Классический сценарий взаимоблокировки состоит в том, что один из потоков получил объект синхронизации и выполняет блокировку.Объект синхронизации, который пытается получить другой поток.Это одна из самых распространенных проблем с потоками.

...