【问题标题】:Repeated single step debugging ≠ run debugging重复单步调试≠运行调试
【发布时间】:2011-11-24 18:44:18
【问题描述】:

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

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

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

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

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

该程序多次运行一个简单的两人游戏,游戏涉及在棋盘上移动一个计数器,两个玩家都是自动的并且随机移动。每条线发生 100 场比赛,有些比赛在一定数量的比赛到期之前不会结束并且不被计算在内。从这8组随机游戏中可以看出,平衡的很好,至少对于那些随机出手的玩家来说,谁会赢谁会输。

下图显示了使用F5 运行。

有些东西不在这里,游戏运行不会相互影响,而场景只是一个停止和开始计数的地方,它们不会影响任何东西。然而与第一张图片非常不同的是,我们连续赢了所有 100 场比赛,两次赢了,但在 2 盘之后连续输掉了 100 场全新的无关比赛。

给出第二张图片的明显答案是我的程序逻辑有问题,但没有。令人沮丧的是,当我去调试问题时,缓慢地运行调试器以便我可以看到正在发生的事情来修复它。

可能出了什么问题?

【问题讨论】:

  • TYVM Reed Copsey 和 Scott Chamberlain :¬) 每个“Random rand = new Random();”之间发生了一个长循环涉及大量使用“rand”,但似乎还不够长。我现在只声明了一次并且程序可以运行。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您说玩家随机移动的事实意味着您很可能被将new Random() 放入循环中的常见错误所捕获。使您的随机对象静态或将其移出循环,您的问题就会消失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      相关资源
      最近更新 更多