我有一个严重的讨厌的虫子,我没有多少时间追踪。它只显示为程序冻结和窗口,说明程序没有响应时,我运行它没有附加调试器。
当我从visual studio中将调试器附加到进程并逐步执行代码时,没有什么不正常的,恢复执行会使程序再次运行,只是很好,不再冻结。
如果调试器的存在,这可能是什么类型的bug呢?
发布于 2011-03-01 09:01:35
您应该注意代码中的任何竞赛条件。设置断点并逐步遍历代码可能解决一个操作尚未及时完成的任何计时问题,但当您暂停执行时,它将及时完成。
发布于 2011-03-01 09:02:20
它可能实际上没有被锁定--可能是因为正在执行的代码运行在与UI相同的线程上,所以看起来它被锁定了。显然,如果您正在遍历代码,您可以看到它实际上在做一些事情,但是当某个进程冻结UI时,它似乎经常被锁定。
查找需要时间才能完成的大量循环或进程,并尝试在不同的线程上运行它们,并查看是否处理好了它们。您还可以通过查看任务管理器中的CPU使用情况来判断您的应用程序是否真的被冻结了,或者它只是在运行一个长进程。
作为一种临时措施,您可以尝试在循环期间执行一些您怀疑可能是通过更新UI来造成这种情况的操作。例如,在WinForms应用程序中,可以添加代码,通过添加标签和修改文本来显示循环中的位置。
例如:
for (each Employee currentEmployee in myEmployees)
{
lblStatus.Text = "working on " + currentEmployee.FullName;
Application.DoEvents();
}
以这种方式更新UI将减慢应用程序的速度,因为对Application.DoEvents的调用是昂贵的,但这将有助于向用户保证程序不会被锁定(如果您将其保存在生产中),或者您可以选择将其排除在最终的生产版本之外,只需在开发/测试时使用它来查看处理过程的进展情况,并确保应用程序不会被锁定。
发布于 2011-03-01 09:08:26
当我遇到一个问题,运行调试器的行为似乎改变了我的应用程序的行为,我将回到旧的运动鞋-网络调试方法输出评论到一个文件。这将使您深入了解您的程序的执行路径,并帮助您确定可能陷入困境的位置。
https://stackoverflow.com/questions/5157682
复制