gpt4 book ai didi

c# - 被阻塞的 Windows 消息循环的调试思路

转载 作者:行者123 更新时间:2023-11-30 12:36:07 25 4
gpt4 key购买 nike

我有一个长期存在的 C# .NET 3.5 应用程序“卡住”,我对此不知所措。有两个 C# 可执行文件。一个有完整的用户界面,另一个作为托盘应用程序运行。它们都通过 WCF 与第三个服务应用程序通信,该应用程序也在托盘中运行。

主 Winforms 应用程序的 UI 线程会随机死锁。奇怪的是,如果我退出托盘应用程序,此应用程序的用户界面将解锁。

每当我将调试器附加到任何一个应用程序时,我都没有学到任何有用的东西。 UI 线程在 Application.Run 方法的卡住应用程序中被阻塞。所有其他线程要么在休眠,要么在调用 UI 线程时被阻塞。

同样神秘的是,另一个正在运行的应用程序(如 Photoshop)在出现此死锁时会出现奇怪的行为。退出托盘应用程序也会对此进行排序。

我只能推断出主 Windows 级消息泵出现问题,但我真的不明白如何进一步调试它。我已经安装了框架源代码,可以看到死锁的应用程序卡在了 while 循环中:

Application.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop

但对这些信息的了解还不够多。

有没有人对在哪里进一步寻找有任何建议?几个月来我一直在追查这个随机死锁错误。

谢谢,尼克

最佳答案

我认为这可能是一个转移注意力的问题,因为这个是在 Visual Studio SDK 中,所以您的调试确实卡住了。

我不得不调试一些与工作相关/与工作无关的卡住,它们非常非常讨厌,需要细致的检测和代码审查。所以请耐心等待!

以下是我的一些建议:

1) 您会在途中看到一些转移注意力的问题,因此请注意不要被窃听并将问题的表现与原因本身混淆。

2) 这次卡住的时间是什么时候?多久时间?一个 TCP 连接超时通常需要 23 秒,而一个数据库连接超时需要 30 秒,一个命令需要 120 秒(在不同的设置上可能会有所不同),所以它所花费的时间是一个很大的线索。如果它无法自行解决并且您必须关闭一个应用程序才能摆脱它,那么几乎可以肯定是线程或数据库死锁。

3) 使用 sysinternal 的 Process Explorer 和 Process Monitor 查看它们在做什么以及它们在什么时候卡住。最后的事件可能会给你一些提示,但并非总是如此。

4) 我知道这需要一些时间,但开始在您的代码中编写跟踪,以便您找到问题的确切位置,从那时起,通常需要几个小时到几天才能找到问题。

5) 如果您有更多信息,请发布另一个问题并告诉我。

关于c# - 被阻塞的 Windows 消息循环的调试思路,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3914365/

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