模块经过优化,即使在未选中优化选项的调试版本上也难以调试

时间:2019-06-21 01:52:35

标签: c# visual-studio debugging

我有这个Web程序,它引用了我们在同一解决方案中编写的几个类库项目。但其中之一很特别:中断调试期间的执行,在尝试监视某些变量时收到Cannot evaluate expression because the code of the current method is optimized消息,并且在逐步执行时跳过了一些代码行。除此库外,其他所有库都可以调试。

我使用了Debug-> Windows-> Modules,看到对于这个有问题的DLL,模块优化列为'Yes'。我检查了解决方案属性,并确认该解决方案级别及其下的每个项目的活动配置均为Debug

对于有问题的项目,我还在Build页面上确认选中Define DEBUG constant,并且未选中Optimize Code。在Advanced页中,Debugging informationFull-与其他库相同。

当我可以找到的所有可能选项都正确设置时,为什么要对此进行优化?

1 个答案:

答案 0 :(得分:0)

启动开发人员命令提示符。运行ildasm。打开有问题的DLL,然后双击Manifest。找到以下代码:

  // --- The following custom attribute is added automatically, do not uncomment -------
  //  .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 02 00 00 00 00 00 ) 

记住01 00 02 00 00 00 00 00。打开一个普通的可调试DLL,然后找到该值为01 00 07 01 00 00 00 00

这最终指向Assembly.cs中项目属性下的一行。

[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]

结果证明,其中一名开发人员在提交之前就丢失了代码,因此决定反编译DLL(不幸的是发行版)以取回代码,然后将其提交回存储库。删除此行,一切将恢复正常。

根据记录,戴夫·布莱克(Dave Black)在另一篇文章中表示:

  

如果DebuggableAttribute不存在,则肯定是经过优化的程序集

受到https://dave-black.blogspot.com/2011/12/how-to-tell-if-assembly-is-debug-or.html

的启发