VS2010中调试.NET Framework的源代码:处理无法计算表达式的值的错误

  在使用VS2010调试MS提供的.NET Framework源代码的时候,有可能你会碰到在调试的时候,很多变量都是不能正常查看的。而在极端的时候,你查看所有的变量都会报错,比如:当前方法的代码已经过优化,因此无法计算表达式的值。

  我这两天就碰到VS2010 报:"当前方法的代码已经过优化,无法计算表达式的值"的这个错误了,具体的错误截图如下图。

调试.netframework出现错误

  这个错误结果非常明显,就应该是我执行的时候,执行的是已经经过优化过的代码了,但是在那里设置,还真是不知道。在网上搜索,这方面信息也不多,发现最多的说法是:

  1. 当前运行的版本应该设置为Debug;
  2. 如果不行,尝试下,先Step over下,在查看下值;

  当然,这些尝试都对我无效,还有一个说法是设置问题(其实就是要启用Debug .NET Framework的设置方法):

  1. 在工具->选项->调试->符号->设置:设置好 (标准步骤)
  2. 在工具->选项->调试->常规->勾选 启用.NET Framework源代码单步执行
  3. 在工具->选项->调试->常规->不勾选 启用"仅我的代码"(仅限托管) (这个是在上一步操作的时候,系统会自动提示你的,确定就去掉勾选了)

  设置好类似下面这样的:

vs2010调试.netframework源代码的设置

 当然这些对我的这个报错都没有用,但我还是决定将它们列出来,相信对其他的朋友会有一定的帮助。

  我的这个"当前方法的代码已经过优化,因此无法计算表达式的值"在中文搜索是没有找到多少有价值的参考,无奈,我只好选择英文搜索下:Cannot evaluate expression because the code of the current method is optimized. 如果你需要查找,可以使用这个作为关键词试试,当然,遗憾的是我在初步看下来的时候,并没有我需要的信息(也许有,没看到),大部分的都是问为什么自己的代码在调试会出现这个问题。

  在问题明确的前提下,我的目标明确而单一——就是找个方法,让VS2010 在调试的时候禁止启用优化

  最终我找到了方案:其中How to disable optimizations during debuging给出了其他人的两个不同方案。E文好的可以直接参阅,我这里简要说明下这两个方案,为E文不是很好的朋友抛个砖:

  • 在启动的时候设置环境变量,让VS2010启动的时候加载之后,在代码调试的时候不执行优化

这个方法理论不难,第一步:是在cmd下来启动VS2010,你输入

## 设置环境变量
> set COMPLUS_ZapDisable=1
## 这里路由到你VS2010安装的目录下面,这句是原文的,在我机器上用不了
## 因此,如果你要使用,请改成适当的路径
> cd /d "%ProgramFiles%\Microsoft Visual Studio 10.0\Common7\ide\" 
## 启动VS2010
> start devenv.exe
## 退出CMD
> exit

但是这个每次启动都要在cmd下来启动denenv.exe(VS2010 IDE),比较麻烦,因此,原文作者也建议(我附议),将这个代码保存成debuging.bat(文件名是我想的,你可随意),代码参见上面的即可,每次要测试的时候,直接双击bat运行进入IDE环境。
第二步:在进入VS2010 加载要调试的程序之后,右键项目->属性->调试->不勾选 启用Visual Studio 承载进程,保存。

vs2010调试设置

第三步:不用说,调试吧。

注意,这里我要补充下,在Web 程序测试的时候,并没有上面那项:启用Visual Studio,也没有调试Tab,因此,不用操作第二步即可。我的Web程序就在第一步设置变量后成功追踪到参数值。

  • 是在需要调试的目录中创建和应用程序名称一样的一个.ini文件,比如你程序是ABC.exe,那么你需要的是一个ABC.ini文件

 这个方法同样也是要配置参数的,只不过将参数放到了应用程序下面来操作,具体操作你可以参照MSDN上的这篇文章来做,简单点说,就是在程序同目录下,放同名的ini文件,文件内容为下面这些内容:

[.NET Framework Debugging Control]
GenerateTrackingInfo=1
AllowOptimize=0

就这样简单,你就可以在IDE中禁用优化,方便执行Debug工作。

 

Wednesday, September 12, 2012 | .NET技术

文章评论

No comments posted yet.

发表评论

Please add 7 and 2 and type the answer here:

关于博主

  一枚成分复杂的网络IT分子,常年游弋于电子商务,属于互联网行业分类中的杂牌军。当前正在待业中...