进入 C# 调试器以除以零
Posted
技术标签:
【中文标题】进入 C# 调试器以除以零【英文标题】:Break into C# debugger for divide by zero 【发布时间】:2010-10-16 17:12:52 【问题描述】:我将 C# 与 XNA 库一起使用,并且我的 Vector3 对象中出现了 NaN。当有问题的计算发生时(例如除以零),有没有办法闯入调试器?目前该程序只是继续运行。我正在使用 VS2008 专业版。 Exceptions 对话框中的所有异常都在“user-unhandled”列中被选中。
编辑:澄清一下,我无法确定错误的计算在哪里。这就是我希望调试器自动中断的原因。设置断点不是解决办法。
【问题讨论】:
【参考方案1】:首先将 double/float 除以 0 得到 Infinity/-Infinity,具体取决于 double 是正数还是负数。只有零双精度/浮点数除以零给出 NaN。无论哪种情况,都不会抛出异常。
您应该能够使用条件断点来检测特定变量何时设置为这些值之一。但在检查 NaN 时要小心,因为 NaN != NaN。
double a = double.NaN;
Console.Out.WriteLine(a == double.NaN); // false
Console.Out.WriteLine(a == a); // false
Console.Out.WriteLine(double.IsNaN(a)); // true
【讨论】:
据我所知,条件断点是在特定的源代码行进行评估的。那正确吗?问题是我不知道 NaN 来自哪里,这就是为什么我希望调试器在它发生时停止。 是的,你必须在一行代码上设置断点。但是,您应该能够通过添加断点和重新运行代码来磨练源代码。最初我认为“checked”关键字会有所帮助,但在我的测试中却没有。 是的,看来 IEEE 浮点规范。规定这种情况没有例外。看来我得费尽心思才能找到了。谢谢。【参考方案2】:听起来您正在以某种方式处理异常(例如捕获通用异常)您可以做的是按 Ctrl+alt+E 来调出异常对话框——确保选中“抛出时”复选框您感兴趣的例外情况
【讨论】:
没有什么不同。它只是继续运行。 在那种情况下——是什么让你认为抛出了异常? (我的默认设置是停止抛出任何托管异常以涵盖任何可能性)。条件断点也可以提供帮助 好吧,也许它没有被抛出。我希望是的。由于计算几乎肯定是在 XNA 库的 Vector3 成员函数中进行的,因此我无法控制它是否允许出现异常。不过,我希望“当被抛出时”在那里工作。【参考方案3】:您可以设置一个 conditional breakpoint,它仅在表达式的除数为 0 时才中断。
【讨论】:
【参考方案4】:我知道这是一篇旧帖子,但是.....
根据经验,它几乎总是 Vector3.Normalize 我错误地使用。
当我不确定它是否会是零长度时,我现在总是这样做
float L = V.Length(); 如果(L!= 0.0) V /= L;
在 Normalize 中除以零应该给出异常,但事实并非如此。让我很头疼。
【讨论】:
以上是关于进入 C# 调试器以除以零的主要内容,如果未能解决你的问题,请参考以下文章