【问题标题】:Error settings breakpoints but only on some lines while debugging错误设置断点但仅在调试时出现在某些行上
【发布时间】:2012-01-24 15:05:48
【问题描述】:

此行导致PostEntityImages 集合中出现“未找到密钥”。

Entity pimage = _context.PostEntityImages["postcreate"];

当我在该行上放一个断点并将其放在监视窗口中时,它可以正常工作并且该键 存在。

更新:

protected override void ExecutePlugin()
{

try
{
    Entity pimage = null;
    if (_context.PostEntityImages.ContainsKey("postcreate"))
        pimage = _context.PostEntityImages["postcreate"];
}
catch (Exception)
{
    // Never hits this line
    throw;
}
} // When stepping in/over the line assigning pimage, execution will jump to this point, then be caught in the catch block of this methods caller.

更新 #2:

在调试模式下,一些断点设置得很好。其他给出错误“无法设置以下断点:”

【问题讨论】:

  • 你检查了大写、小写的拼写吗? ContainsKey 返回什么?真假?
  • 此外,在调试器中检查变量值可以触发其他代码,例如使用后期绑定时。
  • 我同意,案例是我的第一选择。
  • @MBen _context.PostEntityImages.ContainsKey("postcreate") 返回真。我直接从代码窗口复制到监视窗口中。
  • 所以也许你应该尝试这样做:PostEntityImages.TryGetValue ("postcreate", out entity);

标签: c# .net visual-studio-2010 clr dynamics-crm-2011


【解决方案1】:

您描述的断点和单步行为通常是由于尝试在“发布”构建配置中调试您的项目而引起的。在这两种情况下,您很可能会遇到编译器已优化代码行的情况,因为它们无关紧要。

例如,如果您有以下代码:

try
{
  throw new ArgumentNullException("foo");
}
catch
{
  var x = 0;
  throw;
}

上面的catch 块没有用,编译器的流分析足够聪明,可以确定可以安全地优化掉它。如果您在运行这样一个优化的构建时单步执行代码,它只会跳过您的异常处理程序并跳转到调用者的异常处理程序。设置断点也会产生奇怪的错误,尤其是当您在调试程序时尝试将它们设置在优化后的行上时。

在调试、非优化构建中,编译器将保留原本无意义的语句(例如,将值分配给不再使用的变量),特别是因为它们是有用的调试工具。

确保您使用的任何构建配置都没有在项目的“构建”属性中设置“优化代码”复选框。请注意,配置的名称对 VS 没有意义——如果您将项目的构建配置命名为“Debug”但打开优化,您将获得不可调试的构建。

【讨论】:

  • @MicharlEdenfield 感谢您的提示。我处于调试模式并且未选中优化代码。只有 1 个部分不能没有设置断点,它上面和下面的行都很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
相关资源
最近更新 更多