gpt4 book ai didi

c# - 有没有一种简单的方法可以通过线程转储来查找线程死锁的原因?

转载 作者:行者123 更新时间:2023-12-03 13:16:00 24 4
gpt4 key购买 nike

我们在生产中有一个 C# 控制台应用程序,它存在间歇性线程死锁。我试图通过将 VS 2017 附加到正在运行的进程来查找死锁,但我找不到任何方法来轻松找到死锁的原因。似乎没有任何窗口可以识别哪些线程拥有哪些锁。 (我尝试使用“内存”窗口,但根本不起作用)。

我也尝试过使用转储文件,但发现很难理解它显示的内容。 (但这是在我知道我正在寻找死锁之前。)

我习惯于在 Java 中使用 JStack,这是一个针对正在运行的 Java 应用程序运行的命令行实用程序,它打印线程转储,识别死锁,并在每个 StackTrace 中显示线程锁定监视器的点。

是否有一些适用于 .NET 的等效工具?

最佳答案

当死锁发生时,我会使用 WinDbg 检查从进程中获取的完整用户转储。确保您拥有准确的二进制文件(DLL-s 和 PDB-s)以及转储文件。为您的二进制文件(32 位或 64 位)使用适当的 WinDbg 版本。

使用 File->Open crash dump... 命令打开您的转储,这将在 WinDbg 中打开一个“控制台”窗口。您可以通过在底部输入区域中键入命令来使用它。您可以通过在 Edit 菜单中记录来保存所有 WinDbg 输出。

您可以使用 .loadby sos clr 加载 SOS 扩展,然后使用 !EEStack 获取所有调用堆栈。您可以尝试使用 -short 参数来查看您是否在线程顶部发现了相同的函数。

正如@dmitry-egorov 在评论中所建议的,您还可以使用来自 SOSEX 的 !dlk

当您查找可能导致死锁的函数时,请查找您的 函数 - 它们可能不在堆栈的最顶部但会很接近 - 您的一些函数可能尝试以不同的顺序获取 2 个不同的锁,但他们死锁了。

Here's some documentation about how to use WinDbg.

关于c# - 有没有一种简单的方法可以通过线程转储来查找线程死锁的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43785465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com