【问题标题】:VS2015 Debugger showing wrong values?VS2015 调试器显示错误的值?
【发布时间】:2015-10-02 13:40:47
【问题描述】:

编辑:当我在 Visual Studio 2013 中运行此代码时,调试器显示 Utc,而不是 Local。这是 Visual Studio 2015 调试器中的一个错误。

编辑:已获取代码并放入独立控制台应用程序,但无法在任一版本的 VS 中重现。无赖。

有人可以向我解释一下您在此屏幕截图中看到的内容是如何可能的吗?!

  1. 在第 298 行,endingTimePeriodStartDate 被重新定义为其 Date 值,但设置为 DateTimeKind.Utc
  2. 在第 300 行,如果 endingTimePeriodStartDate 实际上不是 DateTimeKind.Utc,则会引发异常。
  3. 305行的调试器断点命中,表示302行的异常没有抛出,表示endingTimePeriodStartDate.Kind == DateTimeKind.Utc
  4. (我还在第 305 行之前做了一个System.Diagnostic.Debug.WriteLine(endingTimePeriodStartDate.Kind),它会在输出窗口中打印“Utc”)。
  5. 当我在 Locals 和 Watch 调试器窗口中查看 endingTimePeriodStartDate 时,当我将鼠标悬停在变量上时,Kind 属性显示 DateTimeKind.Local

【问题讨论】:

  • 你能在一个简短但完整的应用程序中重现这一点吗?我们都可以自己尝试一下吗?
  • 当您返回 Task 时,我猜您使用 async 编程 -> 在 Ln 300 和 305 之间的小间隙中是否有可能另一个线程更改 endingTimePeriodStartDate
  • 你能重现吗?可能是一个令人讨厌的软错误
  • 附带说明:您使用的是 VS 2015 和 C# 6 -> 为什么不在 Ln 295 中使用 new ArgumentNullException(nameof(date)) 来消除“魔术字符串”?
  • 问题不在于您是否使用异步,而在于是否存在任何并行性。如果函数仍然返回 Task,这仍可能归结为多线程问题

标签: c# visual-studio visual-studio-2015 visual-studio-debugging


【解决方案1】:

通常调试器会显示错误的行号,如果它运行的 dll 版本(以前的版本)与您的代码显示的不同,它会进入旧代码。发生这种情况

  • 当有某种缓存时
  • 之前运行的版本没有正确关闭,或者仍在另一个进程中运行。
  • 当 Visual Studio 没有指向正确的代码时

通常要解决此问题,您应该:

(首先尝试“清理”和“重建”)

  1. 停止所有正在运行或调试的 Visual Studio 项目。
  2. 关闭所有 Visual Studio 解决方案和窗口,使 Visual Studio 不运行。
  3. (如果下一步不能解决问题,那么下次请重新启动计算机,然后再继续下一步)
  4. 仅重新打开您需要运行的解决方案。点击“清洁解决方案”。然后“重建解决方案”。

检查这是否解决了问题。

  1. 手动删除 bin 文件夹:(如果清理/重建不起作用)

5.1 如果您害怕,请备份您的整个源目录。一切正常后,删除备份...

5.2 手动进入依赖项目(在“错误代码显示”项目中引用),在每个项目中,进入 obj 并进入 bin 文件夹并删除从那里自动创建的所有内容 - 在换句话说,您没有手动放置的所有内容。通常这就是一切。不用担心,Visual Studio 会重新创建 Debug 和 Release 目录并将它们填满。

同时删除项目的 obj 和 bin。

重建一切。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多