我正在用C#开发一个WinForm多线程应用程序。 有时,我的应用程序会挂起,或冻结或阻塞。
当这种情况发生并且我在DEBUG模式下运行时,无论如何都要了解我的应用程序当前的代码行是什么?由于它被冻结,我希望找到一个应用程序被锁定或阻止的点或其他什么。 有可能这样做吗?
当它被冻结时,我试图打开CALL STACK窗口,但这不会显示任何信息;我可能会采取一些行动吗?有些“暂停和检查”或其他什么?
答案 0 :(得分:5)
您可能需要打开“线程”窗口,然后更改当前线程。在调试时,选择Debug-> Break All,然后打开Threads窗口。如果你浏览每个线程,通过双击线程,你应该能够调查每个线程的调用堆栈。
话虽如此,如果你可以在VS 2010中运行你的程序 - 这会变得容易多了。在VS 2010中,您可以使用新的Concurrency Profiler,并在Concurrency Profiler下运行代码,并选择“可视化多线程应用程序的行为”。一旦你的应用程序锁定,杀死它,让分析器流失 -
最终,您将获得一个图表,其中显示了程序中的每个线程,以及它们何时被锁定。将显示每个被阻塞线程的callstack,以及所持有的锁(使用源代码行)。这样可以很容易地找到死锁。
答案 1 :(得分:2)
连接调试器后,进入Debug菜单并选择'Break All'...然后你可以检查所有线程的调用栈。
答案 2 :(得分:2)
您可以按暂停并查看其结束位置(使用上述调用堆栈窗口)。但是,您最终可能会使用本机代码。您可以尝试稍微走出一点,或者只是查看堆栈以获取要调试的托管函数。
或者,您可以在应用程序“冻结”之后放置一个断点,并尝试查明未结束的循环。
以上两种情况都假设您的应用程序正忙(100%cpu使用率)。但是,如果您的应用程序陷入死锁或只是等待无法打勾的互斥锁,则您必须手动重新读取代码并尝试自行解决。