我在 Visual Studio 2010 Ultimate 中使用 C# 和 XNA。
我有一个程序执行一些不涉及计时、线程或任何其他可能影响结果的计算,如果我停止执行调试,但在继续运行程序的其余部分之前没有做任何事情。
程序结束时将一些输出打印到屏幕上。
在此程序中,重复按 F10
直到显示输出所产生的结果与仅按 F5
在调试时运行或在不调试的情况下运行产生的结果不同,这两者都会产生错误的结果。
这显示了具有单个 F10
步骤的运行。
该程序多次运行一个简单的双人游戏,该游戏涉及在棋盘上移动一个计数器,两个玩家都是自动的并随机移动。每条线进行 100 场比赛,有些比赛在一定次数过期之前不会结束,因此不计算在内。从这 8 组随机游戏可以看出,它是相当平衡的,至少对于随机走棋的玩家来说,谁赢谁输。
下图显示了使用 F5
运行。
这里有些不对劲,游戏运行不会相互影响,而布景只是一个停止和开始计数的地方,它们不会影响任何东西。然而,与第一张图片非常不同的是,我们连续赢得了所有 100 场比赛,两次,但随后连续两盘输掉了 100 场全新的不相关比赛。
给出第二张图片的明显答案是我的程序逻辑有问题,但事实并非如此。令人沮丧的是,当我去调试问题时,运行调试器的速度很慢,这样我就可以看到发生了什么可以修复它。
有什么问题吗?
最佳答案
如果这没有使用线程,那么我的主要怀疑是某些东西可能正在使用 System.Random
类。确保每次调用 Next()
时都使用 Random 类的相同实例。
可能的问题是,如果您快速连续地调用使用 Random
的方法(即:正常运行时,而不是在调试器中),并且每次都创建一个新实例,您可能很可能用相同的种子来播种随机实例,因为它基于系统时钟。通过调试“减慢速度”可以防止这种情况发生,这就是为什么在步进调试 session 期间行为会更好的原因。
关于c# - 重复单步调试≠运行调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8261386/