我们在生产中有一个C#控制台应用程序,它具有间歇性线程死锁。我试图通过将VS 2017连接到正在运行的进程来发现死锁,但我找不到任何方法轻易找到死锁的原因。似乎没有任何窗口标识哪些线程拥有哪些锁。 (我尝试使用内存窗口,但根本不起作用)。有没有一种简单的方法来进行线程转储以查找线程死锁的原因?
我也尝试过使用转储文件,但发现它很难理解它显示的内容。 (但是,这是之前我知道我正在寻找一个死锁。)
我习惯于在Java中使用JStack,一个命令行实用程序运行反对运行Java应用程序,它打印一个线程转储,并识别死锁,和在每个StackTrace中显示线程已锁定显示器的点。
是否有一些等效的.NET工具?
,因为它代表的问题是题外话的网站,因为它是请求场外资源/工具。但是,如果您可以将代码最小化为[MCVE]并发布,我相信问题应该没问题。通过这样做,你也有可能找到它锁定自己的原因。注意,log4net等日志工具在配置正确时会打印线程标识,这可以帮助您在有足够日志记录的情况下找到它所锁定的原因。 – TheLethalCoder
在.NET中你有没有完全相同的信息?每个线程的调用栈...(如果你不想/不能附加VS,有库,GUI和CL应用程序来执行它) –
如果你附加到Visual Studio 2015的正在运行的进程,那么你应该能够'暂停'并打开一个名为'Parallel Stacks'的东西(从主菜单中选择Debug/Windows/Parallel Stacks) 我不知道在VS2017中可用,但我已经使用过这个功能几次,这对我帮助很大。 – recineshto