面对出现作为应用挂起的间歇性多线程错误。当我暂停调试时,我会看到线程等待锁(_sync)子句。所以问题是:
。
我认为这不是“死锁”,因为死锁意味着至少存在两个对象和两个线程,而在考虑代码时只有一个同步对象。我认为其他线程锁定了对象并挂起,但我找不到它是哪一个线程。
发布于 2011-08-28 10:39:23
我将记录一些基本的调试技术。从Debug + Windows + Threads开始,它将显示进程中运行的所有线程的列表。您可以在Location列上悬停,您将得到显示线程堆栈跟踪的工具提示。这使您可以快速地进入实际运行代码的线程。双击感兴趣的一个,然后切换到Debug + Windows + Call Stack以获得更持久的视图。这可能会帮助您找到获得锁的线程。
否则,您可以找出哪个线程拥有锁对象。切换到被双击阻塞的线程,然后使用Debug + Windows +内存+内存1.在地址栏中键入"_sync“。右击窗口并选择“4字节整数”。从窗口左上角显示的十六进制地址中减去4,然后在“地址”框中键入该地址。或者单击滚动条向上箭头并查看第一行中的最后一个值。这是拥有锁的线程的Thread.ManagedThreadId。请注意,这并不总是有效的,对象中的这个字段也用于其他目的(例如,GetHashCode)。
知道线程的托管ID后,现在可以查看线程的Debug + Windows + thread窗口。但只有在VS2010上,早期版本才不会在此窗口中显示线程的托管ID。为此,您需要添加一些显示Thread.CurrentThread.ManagedThreadId值的跟踪代码。添加跟踪代码通常是解决线程问题的一种有用技术。这是非常危险的,然而,这段代码改变了时间,并可能使线程问题消失。许多跟踪侦听器也有一个隐含锁。
发布于 2011-08-28 09:37:50
调试这个功能(没有漂亮的VS2010功能)的一种方法是,只有使用属性/访问器才能访问_sync。有一些诊断文本或断点,你可以看到什么线程想要的是同步和什么时候。
除此之外,我不能在没有看到代码的情况下给出任何合理的答案。
https://stackoverflow.com/questions/7220038
复制相似问题