进入 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# 调试器以除以零的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 允许在浮点类型中将非零数除以零?

C#:以干净的方式将调试器附加到进程

在调试期间进入 c++/CLI 包装器 dll 和 c# dll,同时在 firebreath 上制作插件

C#桌面程序无法调试以及无法查看变量的解决办法

C#桌面程序无法调试以及无法查看变量的解决办法

Visual Studio 2019 C# 断点调试 & 凯撒密码,单码密码实现