公共语言运行时无法设置断点。

32

这实际上是这个问题的另一个部分。

设置断点时只在某些行出现错误

我正在使用VS 2010远程调试CRM 2011插件。

在我的一个源文件中,我可以在整个代码中设置断点,除了其中的一些地方。

当我尝试设置断点时,会出现以下错误:"无法设置以下断点:"和"公共语言运行时无法设置断点。"

protected override void ExecutePlugin()
{
    SetStateResponse response = new SetStateResponse(); // Breakpoint works

    // Message switch
    switch (_crmMessage) // Breakpoint error
    {
        case CrmPluginMessageEnum.Create:

        Entity pimage = null; // Breakpoint error
        if (_context.PostEntityImages.ContainsKey("postcreate")) // Breakpoint works
            pimage = _context.PostEntityImages["postcreate"]; // Breakpoint error

        break; // Breakpoint error
        }
} // Breakpoint error

更新 另外,在模块窗口中,它显示dll为优化:否 用户代码:是 符号状态:符号已加载


1
请添加您的代码!有很多情况(例如lambda表达式,变量声明而不初始化)无法正常设置断点。 - Alexander Galkin
http://blogs.msdn.com/b/habibh/archive/2009/09/01/troubleshooting-common-breakpoint-problems-in-the-visual-studio-debugger-part-i.aspx - Hans Passant
2
当出现“无法设置以下断点”时,您正在尝试将断点设置到不编译为任何实际代码的位置,例如变量声明或空格。请显示您无法设置断点的确切代码行。 - Ben Robinson
4
如果你正在进行远程调试,你的PDB文件是否可能与编译后的DLL不同步?你尝试过删除bin和obj文件并重新编译吗? - John Koerner
1
你是否百分之百确定DLL与源代码匹配,插件是否正确部署?一些断点可以正常工作而其他断点不能正常工作的事实表明DLL已过时或符号文件未更新。 - Ben Robinson
显示剩余5条评论
7个回答

45

以下是与其他答案已经提到的两种可能性:

  1. 确保使用调试版本的程序集而不是发布版本,因为发布版本会删除或优化您的代码。
  2. 确保在每次部署项目属性选项卡中Visual Studio中的程序集时更新版本。当您增加版本时,CRM将确保卸载旧的程序集版本并重新加载新的程序集版本,无需进行IIS重置。

1
电子男孩,非常感谢你,我真的太蠢了(用这个狗屎东西我已经坐了大约2个小时...非常感谢你) - niz_sh

4
我在使用Ctrl+B快捷键创建断点时遇到了问题(请参见附图),我输入了一个不存在的函数名称,因此断点被添加但导致了错误。每次启动项目时都会出现这个错误。
解决方案: 我从断点列表中删除了断点(请参见附图左下方),选择断点部分,然后选择该项并单击删除。enter image description here 如果您看不到断点部分 您可以通过按 Ctrl+Alt+B 检索它。

4

当我在两个Visual Studio实例中打开项目时,我遇到了同样的问题。我没有调试的项目锁定了该文件,并通知我“此文件已在源编辑器之外进行修改。”在我的非调试解决方案中接受更改后,我不再收到错误消息,并且我的断点在我正在调试的解决方案中被触发。

听起来可能有很多可能导致这个错误的原因,但是对我而言,这就是解决方法。


0

我刚刚有过类似的经历,解决方法是在调用例程的位置设置断点,然后逐步单步执行进入例程,直到看到它实际上在做什么。在我的情况下,有一个返回语句阻止了例程中的所有代码运行,因此优化器将其全部删除了。有时候问题就出在这些愚蠢的地方,对吧?无论如何,如果你从调用栈中更高的层次开始,并进入到出现问题的例程中,问题的原因可能会变得更加明显。


0

我刚刚发现的另一个导致这个问题的原因是,如果您正在针对CRM进行调试,则不会更新插件注册点。即使您将新的DLL复制到目标计算机并远程附加到该进程,也不是CRM将使用的DLL。CRM将尝试从其数据库中获取旧版本的副本,直到重新运行插件注册。

这个错误浪费了我一天半的时间!


0
根据您关于DLL被优化的更新,您指出断点不起作用的行很可能会被优化掉,因为您整个switch语句只是决定是否将值分配给一个从未使用且不在switch语句范围之外的变量。因此,编译器将不会为switch语句生成任何代码,因为它根本没有做任何事情,或者jit在运行时出于同样的原因将其删除。

正确。通过反射器,它显示已转换为if语句。 - user1231231412

0
当我开始运行调试项目时,我遇到了这个错误。通过清除所有项目并重新构建所有项目的方式,我解决了这个问题。重构后,错误不再出现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接