重复单步调试≠运行调试

时间:2011-11-24 18:44:18

标签: c# visual-studio-2010 debugging xna

我在Visual Studio 2010 Ultimate中使用C#和XNA。

我有一个程序执行一些计算,不涉及计时,线程或任何可能影响结果的事情,如果我停止执行调试,但在继续运行程序的其余部分之前没有做任何事情。

结束时程序会将一些输出打印到屏幕上。

在此程序中反复按F10直到显示输出产生的结果与在调试时运行F5而不调试运行时产生的结果不同,这两者都会产生错误的结果。

steps

这显示了具有单独F10步骤的运行。

该程序多次运行一个简单的双人游戏,游戏涉及在棋盘上移动计数器,两个玩家都是自动化的并随机移动。每行发生100场比赛,有些比赛在一定数量的比赛结束之前没有结束且不计算在内。从这8组随机游戏中可以看出,它非常平衡,至少对于那些随意采取行动的玩家来说,哪些人会赢,谁会松动。

下图显示了F5的运行。

run

有些事情不在这里,游戏运行不会相互影响而且集合只是一个停止和开始计数的地方,它们不起作用。然而,与第一张图片完全不同的是,我们连续赢了100场比赛,两次但后来又连续两场失去了100场全新的无关游戏。

第二张图片的明显答案是我的程序逻辑有问题,但是没有。令人沮丧的是,当我慢慢地调试运行调试器的问题时,我可以看到发生了什么修复它。

可能出现什么问题?

2 个答案:

答案 0 :(得分:6)

如果这不是使用线程,那么我的主要怀疑是某些东西可能正在使用System.Random类。确保每次调用Next()时都使用Random类的相同实例

可能的问题是,如果你快速连续地使用Random调用方法(即:正常运行,而不是在调试器中),并且每次都创建一个新实例,那么很可能是用相同的种子播种随机实例,因为它基于系统时钟。通过调试“减慢”可以防止这种情况发生,这就是在步进调试会话期间行为会更好的原因。

答案 1 :(得分:3)

你说玩家随意移动的事实意味着你可能会被new Random()置于循环中的常见错误所困扰。使你的随机对象静止或将其移出循环,你的问题就会消失。