2011-03-14 215 views
3

我有一个运行在.Net框架4上的应用程序,我的应用程序运行托管和非托管代码。在非托管代码中,使用UDP套接字。当应用程序从Visual Studio运行时,一切正常,但当它自己运行时,它通常会冻结。我看到了Windows XP SP3和Windows 7 SP1上的行为。当我将调试器附加到应用程序并暂停时,我可以看到很多很多线程都停留在ntdll.dll中的相同内存地址处。反汇编时,执行的netdll.dll命令是“ret”。如何解决ntdll.dll中的冻结(或死锁)?

这是否为任何人敲响了钟声?

似乎有以前过类似的问题,比如这里报告,并将其与UDP: http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/1b54b2f2-6e7c-405b-bdda-62197ac8a287 没有答案都曾经给。

我还发现一个旧的修补程序的一个类似的问题,但根据微软只适用于Windows NT 4

任何帮助,将不胜感激。

+0

阻塞或非阻塞模式?以前的错误代码? – 2011-03-14 15:07:05

回答

3

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

使用Debug + Windows + Threads窗口来查看你的线程正在做什么。传统的死锁场景是其中一个线程已经获取了同步对象并被阻塞。另一个线程试图获取的同步对象。这是最常见的线程头痛之一。

+1

我同意汉斯 - 它在调试器中运行良好可能会表明某些任务的序列化方式不同(例如,通过执行调试输出)以避免会造成死锁。 – stephbu 2011-03-14 15:56:31

+0

感谢您的帮助! – Ssebu 2011-03-14 17:31:59

+1

我遇到的问题是当我查看堆栈跟踪时,我看到的所有内容都是Microsoft DLL中的调用(使用root和ntdll.dll中的提示),这显然很难找出它来自哪里我的代码。另外,当附加到正在运行的进程时,我必须使用Native选项附加,因为调用堆栈不在托管代码中。 – Ssebu 2011-03-14 17:33:43