如何解决ntdll.dll中的冻结(或死锁)?

时间:2011-03-14 14:54:55

标签: .net udp freeze

我在.Net framework 4上运行了一个应用程序,我的应用程序运行托管和非托管代码。在非托管代码中,使用UDP套接字。当应用程序从Visual Studio运行时,一切都很好,但是当它自己运行时,它经常会冻结。我在Windows XP SP3和Windows 7 SP1上都看到了这种行为。当我将调试器附加到应用程序并暂停它时,我可以看到许多MANY线程卡在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 个答案:

答案 0 :(得分:3)

导致死锁的操作系统不是。是的,您的堆栈跟踪将在ntdll.dll内的KiFastSystemCallRet()上显示它阻塞。在SYSENTER之后,堆栈跟踪指向RET指令。但它只是做你要求它做的事。

使用Debug + Windows + Threads窗口查看您的线程正在做什么。典型的死锁场景是其中一个线程已获取同步对象并正在阻塞。另一个线程正在尝试获取的同步对象。这是最常见的线程问题之一。