我正在开发一个(相对复杂的)游戏。游戏在发布模式下冻结。 1-2分钟后发生冻结。游戏玩法。我的释放模式的当前配置允许我打破(即进入调试),这很好,但可能会给我错误的信息,但这对于这个特殊情况很好(我可以关闭单个优化文件/功能/代码)。
问题是,我(我们,因为我们是一个团队)不知道它挂在哪里。它并不像一个相对较小的无限循环一样简单,因为其他东西(图形,声音)正在更新,只是游戏停止了。主游戏循环(无限循环)总是在运行并且非常长/复杂,因此单步执行将是一个痛苦(但它是一个选项)。
我尝试的第一件事是Visual Studio的break all
,但它总是在不是我的代码中断,因此显示了我的汇编输出。最终,有足够的持久性,SVN历史检查和注释掉代码我将能够找出它挂在哪里,但必须有一个更好的方法...希望?
注意:我知道有一个Visual Studio选项允许仅调试用户代码,但这只是托管代码。
编辑:能够通过堆栈跟踪和大量时间跟踪各种事情来解决问题,以查看游戏挂起的位置。我会选择Sjoerd的答案作为正确的答案,但是,如果有人建议允许自动化这样的任务的工具/技术,请务必添加你的答案!
答案 0 :(得分:3)
如果您中断并遇到不属于您的本机代码,请检查调用堆栈。调用堆栈是调用以到达代码中当前点的函数列表。上升到堆栈中的某个级别,直到遇到当前正在运行的方法。
答案 1 :(得分:2)
作为调试符号和中断的替代方法(在可能的情况下,这是可供选择的工具),添加日志记录:游戏(和其他应用程序)拥有一个巨大的日志记录系统,他们可以打开和关闭它的情况并不少见编译器标志,所以他们仍然可以在“发布版本”中进行某种调试/跟踪。如果你的日志记录工作正常,你应该看看是什么和没有发生什么,并至少知道哪里出了问题。
答案 2 :(得分:1)
在程序挂起时点击Visual Studio中的暂停按钮。
这应该打破当前行的调试器。然后,您可以逐步查看正在发生的事情。
答案 3 :(得分:1)
如果应该执行的代码没有执行,你可能永远无法通过中断来解决问题。有很多方法可以实现。只是几个:
您有一些参数指示下次更新的执行时间。如果以某种方式将其设置为某个大数字,那么执行更新的代码将很高兴看到无需执行任何操作。下一个!这可以给出挂起程序的所有外观,即使它根本没有挂起。状态更新和图形功能仍以规定的速率调用。
你可能会有一些代表时间的计数器和一些用于递增时间的舍入机制。如果计数器是32位signed int并且计数器的粒度是0.1微秒,那么在3.6分钟后你将达到INT32_MAX。现在时间已经冻结,因此您可能再次遇到无法执行更新的情况。
您正在使用单精度浮点数来表示时间和更新时间time += delta_t;
如果delta_t
为10微秒,则会在几分钟后停止工作。这是另一种可以冻结时间的机制。
修改强>
您是否查看了各种线程中的CPU使用情况?上述问题可能导致物理或游戏线程在几分钟后出现CPU使用率大幅下降。如果游戏线程永久锁定,您可能也会遇到此行为,但在这里您可能(使用正确的工具)获得该线程始终处于睡眠状态的指示。