错误设置断点但在调试时只在某些行上

时间:2011-12-20 16:58:41

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

此行导致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:

在调试模式下,某些断点设置正常。其他给出错误“无法设置以下断点:”

1 个答案:

答案 0 :(得分:5)

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

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

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

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

在一个调试的非优化版本中,编译器将保留那些本来没有意义的语句(例如,将值分配给永远不会再使用的变量),因为它们是有用的调试工具。

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