调试多线程应用程序的建议

时间:2011-07-25 07:52:56

标签: .net visual-studio multithreading debugging

我在Visual Studio 2008中逐步调试多线程.NET应用程序时遇到问题。

对于每个阶梯线,Visual Studio变得越来越慢(跳转到下一行需要越来越多的时间)并且通常在几行之后挂起(我得到“Visual Studio忙”气球提示),而我需要停止调试。

我怀疑问题是由于应用程序连接了多个TCP / IP客户端,这意味着每次我创建断点时,他们的网络缓冲区都会被填满,直到我继续我的应用程序。每当我使用F10跳到下一行代码时,Visual Studio会很快唤醒所有其他线程,以便它们处理输入数据。

有没有人有过遇到这些问题的经验,以及如何避免这些问题的建议?

3 个答案:

答案 0 :(得分:7)

这根本不是一件容易的事,我相信你理解这一点。 非常重要的是要清楚地了解.NET Framework提供的线程和同步机制。只有在执行此操作后,您才能开始设计线程同步和管理。

我建议为您的线程定义明确的名称并引入大量的日志记录, log4net 将是一个不错的选择,因为它为您提供了线程安全且强大的日志记录工具。

Visual Studio提示:

在此处查看更多内容:Debugging Multithreaded Applications

编辑:添加了更多提示

尝试确定哪些应用程序逻辑状态对于手动调试非常有用,并且如果可能则使用条件断点,这样可以避免额外的调试器中断:

答案 1 :(得分:2)

正如acoolaum所指出的,最好使用定时日志来查看任何异常或崩溃报告。此外,您可以添加条件编译以使用不会导致任何挂起的备用路径。例如,在调试依赖于从TCP / IP获取信息的函数时,请使用只返回字符串的mock函数,而不实际执行任何TCP / IP通信。

创建的库只是为了进行这种模拟。您可以查看其中一个。

答案 2 :(得分:1)

这个建议可能是一个很长的镜头,但我在这里:你试图调试的应用程序是WinForms应用程序的任何机会,你打开了一个监视窗口?

过去,在我几乎完全停止使用Watch Windows之前,我记得遇到过你速度较慢的情况。如果我的断点在非UI线程的上下文中被击中,并且监视窗口的值的轮询包括UI绑定值,我可以重复它,调试器将默默地吞噬跨线程异常,并且它会变得更慢并且变得越来越慢,直到无法使用。

关闭观察窗完全摆脱了延迟。