我有这个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 information
是Full
-与其他库相同。
当我可以找到的所有可能选项都正确设置时,为什么要对此进行优化?
答案 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
的启发