【问题标题】:System.Math.Abs() calls into native method System.AppDomain.GetId()?System.Math.Abs​​() 调用本机方法 System.AppDomain.GetId()?
【发布时间】:2016-12-16 02:14:58
【问题描述】:

我的条件断点有时可以正常工作,有时会失败,出现以下错误:

断点的条件未能执行。条件是'Math.Abs​​(-4.36767421599683 -x)

  1. 它是如何只在某些时候起作用的?每次运行时条件断点代码都不相同,是否会发生运行时诡计?
  2. 如果有,为什么 Abs() 的代码的任何版本都会调用 AppDomain.GetId() - 这肯定是纯粹的算术?
  3. .NET 参考源显示了一个方法extern public static double Abs(double)。这是否意味着它是总是原生的?它怎么会起作用?

【问题讨论】:

  • 我不会太认真地对待那个错误信息。 VS 版本很重要,最新的调试引擎重写有很多错误。他们知道,他们把旧的留在了原地。工具 > 选项 > 调试 > 常规来修改它。
  • 我刚刚遇到了与简单的“mystring.Contains("Something")”条件断点相同的错误。不知道为什么会发生...
  • 这仍然是每个 VS 版本(包括 VS 15.8.X)中的一个问题。

标签: c# .net visual-studio clr


【解决方案1】:

首先,您需要知道调试器评估不能调用本机方法。 (好吧,这取决于它是否 real func eval,但即使它不是真正的 func eval,我们也会看到它并不完全正确,但等待......)

它是如何只在某些时候起作用的?每次运行条件断点代码时是否存在运行时诡计?

是的,这很奇怪,但它可能是。调试器评估器实际上能够获取应用程序域 id,但有时会发生一些错误,然后您会得到该异常。

如果有,为什么 Abs() 的任何版本的代码都会调用 AppDomain.GetId() - 它肯定是纯粹的算术?

我很确定这个电话不仅仅与 Math.Abs 有关。

.NET 参考源显示了一个方法extern public static double Abs(double)。这不意味着它总是原生的吗?它怎么会起作用?

因为对于某些本机方法,调试器评估器具有以特殊方式处理它的钩子。 Math.Abs 就是其中之一。


我试图在我的 Visual Studio 中重现它,但没有成功。 (对比 2017 年)

尝试在 Watch Window 中评估相同的表达式(后缀为 ,nse)并告诉我您是否仍然遇到异常。

只是向您展示一个尝试评估调用本机代码的方法的示例:(阅读错误消息)

还有一件事,尝试在其他版本的 Visual Studio 中评估它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2014-08-17
    • 1970-01-01
    • 2019-01-19
    相关资源
    最近更新 更多