gpt4 book ai didi

.net - 如何找出线程锁发生的位置?

转载 作者:行者123 更新时间:2023-12-04 12:38:07 27 4
gpt4 key购买 nike

我们公司的一个 Windows Forms 应用程序几个月来出现了一个奇怪的问题。
该应用程序对我们的大多数客户来说非常可靠,但在某些 PC 上(主要是无线局域网连接),该应用程序有时不再响应。 (您单击 UI,Windows 会要求您等待或终止该应用程序)。

很长一段时间我都无法找到问题所在,但现在我明白了发生了什么。
该应用程序有这行代码

// don't blame me for this. Wasn't my code :D
Control.CheckForIllegalCrossThreadCalls = false

并使用了一些后台线程来修改控件。

不,我找到了一种方法来重现应用程序在我的开发机器上停止响应错误并将其跟踪到我实际使用 Invoke() 在主线程中运行任务的行。
Me.Invoke(MyDelegate, arg1, arg2)

显然某处有一个线程锁。
去掉后
Control.CheckForIllegalCrossThreadCalls = false

语句并重构整个程序以使用 Invoke() 如果从后台线程修改控件,则问题(希望)消失了。

但是,我想知道是否有一种方法可以在不调试每一行代码的情况下找到此类错误(即使在应用程序停止响应后我闯入调试器,我也不知道最后发生了什么,因为 IDE 没有跳转到Invoke() 语句)

换句话说:

If my apps hangs how can I figure out which line of code has been executed last?



甚至可能在客户的 PC 上。

我知道 VS2010 提供了一些向后调试功能,也许这会是一个解决方案,但目前我正在使用 VS2008。

最佳答案

也许这对您有帮助:http://www.debuginspector.com/index.htm

它是一个 Visual Studio 扩展,允许您跟踪死锁,并且它具有许多其他用于调试线程的漂亮功能(例如查看多个线程的调用堆栈而无需转到线程窗口)。

关于.net - 如何找出线程锁发生的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3026354/

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