使用MS Symbol Server调试.NET代码 - VS不显示变量值

时间:2008-11-17 02:13:44

标签: .net debugging debug-symbols

当我使用.NET的Microsoft调试符号调试我的ASP.NET网站代码时...当我调试.NET框架代码时,我一直在为大多数变量获取这个愚蠢的“结果”(当然这是由Microsoft Symbol Server提供,我告诉VS2008获取信息,来自

Cannot obtain value of local or argument 'cookie' as 
it is not available at this instruction pointer, possibly because 
it has been optimized away.

就像我正在使用的代码是使用优化的编译代码。如果是这种情况,我可以告诉它不要优化吗?我在DEBUG配置中。这是非常令人沮丧的,因为我无法调试..因为当我单步执行代码时,我无法看到/检索局部变量的值。

任何线索/想法?

5 个答案:

答案 0 :(得分:19)

Shawn Burke描述了一种在blog上禁用此功能的方法。

首先,创建一个CMD,它将加载Visual Studio而不进行JIT优化。

set COMPLUS_ZapDisable=1
cd /d "%ProgramFiles%\Microsoft Visual Studio 9.0\Common7\ide\"
start devenv.exe
exit

进入Visual Studio项目后,请执行以下步骤:

1)右键单击项目文件,然后选择“属性”

2)选择“调试”选项卡并取消选中“启用Visual Studio托管过程”

3)在调试器中启动您的应用程序。

答案 1 :(得分:7)

对于普通的.Net应用程序,您可以使用起始二进制文件旁边的.INI文件禁用JIT优化。这是一个如何实现这一目标的链接

http://blogs.msdn.com/jaredpar/archive/2008/08/29/disabling-jit-optimizations-while-debugging.aspx

调试ASP.Net虽然有点不同,但我不确定这是否适合你。如果您使用轻量级Web服务器(cassini)在本地进行调试,则可以将此技巧应用于Cassini本身。如果您是直接在Web服务器上调试,虽然在IIS内部,我不知道如何使这个技巧工作,但希望它会引导您朝着正确的方向。

答案 2 :(得分:3)

经过大量研究后,我能够找到一种方法,在连接到IIS7 / Windows 7 x64下的IIS托管应用程序时,也可以使这种“COMPLUS_ZapDisable”技术工作。

在我的情况下,我使用的是由Reflector Pro构建的符号,虽然我的猜测是它也适用于OP询问的Microsoft符号。

诀窍在于找到设置该环境变量的正确位置,以便在启用该设置的情况下启动w3wp.exe。为此,请在“HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment”中将名为“COMPLUS_ZAPDISABLE”的字符串键添加到注册表中。将键值设置为“1”,这应该可以解决问题。不要在生产上这样做=)

感谢来自红门的this post的作者Clive Tong指出我正确的方向。

答案 3 :(得分:1)

.NET框架代码已经过优化,因此您无法查看所有变量,因为它们可能在优化代码中不存在。我假设您正在尝试在.NET框架内部进行调试。不幸的是,你无能为力。

答案 4 :(得分:0)

最后,当附加到aspnet_wp.exe Visual Studio 2008,.NET framework 2.0时,此解决方案对我有用:进入项目属性,进入Build选项卡,Advanced button - >将输出调试信息设置为“完整”。希望这有助于某人。