【问题标题】:Vs2017 / C# weird debugger behaviorVs2017 / C# 奇怪的调试器行为
【发布时间】:2019-12-03 18:51:09
【问题描述】:

我在 C# 项目(目标 .Net Framework 4.7.2)的调试版本中受到奇怪行为的困扰。

  1. 以下代码返回 false。
var wHasOvernightShifts = this.ScheduleSegments.Any(
    x => x.SegmentTypeId == eSegmentType.Schedule 
         && !x.IsDeleted 
         && x.ShiftDate == pShiftDate 
         && x.StartTime.Value.DayOfWeek != x.FinishTime.Value.DayOfWeek);

我知道这是错误的答案。当我在 Quick Watch 中评估 RHS(在同一点使用相同的数据)时,相同的代码返回 true。退回调试器并重新执行该语句再次返回 false。 (注意,所有引用的属性都没有副作用)。

  1. 我还有一个方法似乎可以执行但返回 null。永远不会触发方法内的断点。尝试进入该函数将被忽略。断点表示它不会被触发,因为模块尚未加载。但是,在源代码中高出几行,来自同一模块的函数运行正常(w.r.t. 调试和预期函数)。

如果我执行清理并重建,那么一切都会按预期运行。请注意,仅靠重建是不够的。

在第 2 种情况下,在清理/重建之后,该方法返回一个非空集合,并且其中的断点起作用,就像 step-into 一样。

好像编译器的增量部分坏了,或者执行环境刚刚忘记加载了模块。

有没有其他人遇到过类似的问题?有没有简单的解决方案(除了清理/重建)?

n.b.我已关闭“仅启用我的代码”并打开“要求源文件与原始版本完全匹配”以尝试解决此问题 - 不走运。

【问题讨论】:

  • 只有当您故意将调试器退回以再次枚举 ScheduleSegments 时才会发生这种情况吗?
  • 您是否在任何相关类中覆盖了ToString?您的调试器将调用ToString(默认情况下)来格式化显示值,而您的实际代码不会这样做。
  • 什么是this.ScheduleSegments?是列表还是查询?由于延迟执行,在调试器中检查 Linq 语句非常棘手。
  • 1. ScheduleSegments 是一个 Observable 集合。
  • 2.我所有的类都使用 ToString() 以便我可以在调试模式下查看它们。

标签: c# visual-studio debugging


【解决方案1】:

自从我更新项目以确保每个配置都构建到一个单独的目录中以来,已经有几个星期了。问题似乎已经消失了。

我很确定这是问题的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多