我在Visual Studio 2008中逐步调试多线程.NET应用程序时遇到问题。
对于每个阶梯线,Visual Studio变得越来越慢(跳转到下一行需要越来越多的时间)并且通常在几行之后挂起(我得到“Visual Studio忙”气球提示),而我需要停止调试。
我怀疑问题是由于应用程序连接了多个TCP / IP客户端,这意味着每次我创建断点时,他们的网络缓冲区都会被填满,直到我继续我的应用程序。每当我使用F10
跳到下一行代码时,Visual Studio会很快唤醒所有其他线程,以便它们处理输入数据。
有没有人有过遇到这些问题的经验,以及如何避免这些问题的建议?
答案 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绑定值,我可以重复它,调试器将默默地吞噬跨线程异常,并且它会变得更慢并且变得越来越慢,直到无法使用。
关闭观察窗完全摆脱了延迟。