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

use*_*412 2 .net c# clr visual-studio-2010 dynamics-crm-2011

这行导致PostEntityImages集合中的“找不到密钥” 。

Entity pimage = _context.PostEntityImages["postcreate"];
Run Code Online (Sandbox Code Playgroud)

当我把一个破发点上线,并把它放在监视窗口,它工作正常,并且关键存在。

更新:

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.
Run Code Online (Sandbox Code Playgroud)

更新#2:

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

Mic*_*eld 5

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

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

try
{
  throw new ArgumentNullException("foo");
}
catch
{
  var x = 0;
  throw;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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