本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在过去的几个月中,我曾与许多存在调试问题的用户一起工作,他们之中有一部分来自 Microsoft 内部。我发现,如果用户能得到正确的诊断,则很多常见的错误和问题便迎刃而解。因此,我写了这篇文章,旨在向用户提供在使用调试器时能帮助他们解决问题的信息。
本文档包含:
错误消息对话框或错误情况描述
上述错误的原因。
上述问题的解决方法。
在此,我对 VCS 调试器团队和帮助我完成本文及向我提供精彩反馈的人士表示感谢。
原因
1
:
确保已启用
Integrated Windows Authentication
。可能的原因是仅为 IIS 的 Directory 安全启用了
Basic authentication
。
原因
2
:
如果您在使用
Integrated Windows Authentication
,则需要确保您的用户帐户能够完全控制 IIS 的目录。
原因
3
:
如果使用完整的机器名(如
machinename.domainname.something
)创建 Web 项目,则该 Web 站点会被识别为 Internet 站点。因此,Internet Explorer 的默认设置将对登录行为产生影响。在这种情况下,您需要使用当前帐户在具有 IE 设置的“Internet”区域启用登录。
然而,这不是 Internet Explorer 的默认设置,因此最好仅使用机器名来创建项目,将图 4 用作 Security Settings 的指南。
图
4.
设置
Internet Explorer
身份验证
如果出现这一错误消息,则需要针对调试配置 Web。为此,需要在 web.config 文件中设置 debug = true。此文件位于 Web 项目文件夹中。
您可以启动调试,同时不出现错误消息,但是不能到达断点。
您使用
F5
键启动了调试,看起来好像正确启动了调试并且也正确启动了 Internet Explorer,但是您不能到达代码隐藏的代码中的断点。
原因
1
:
在项目属性中未启用
Asp.net
调试
。按照图 8 所示将该项设置为 True。
图
8.
启用
ASP.NET
调试
如果您在机器上安装了 Windows XP Pro 或 Windows 2000 Pro,则可能需要考虑 Visual Studio 7 和 IIS 之间的安装顺序。如果在 Visual Studio 7 之后安装 IIS,则会发生这一错误。在这种情况下,请使用“aspnet_regiis.exe –i”注册“aspnet_isapi.dll”。
消息:访问被拒绝。检验您是否是管理员或某个组成员。
图
12.
访问被拒绝
原因
1
:
您可能安装了
IIS Lockdown
工具。如果这样,则查找 urlscan.ini 文件,并将 DEBUG(区分大小写)添加到 [allowverbs] 部分中。
原因
2
:
如果将域控制器用作服务器,并且项目是使用机器名(非完整域名)创建的,则可能需要将项目的 URL 更改为完整域名。
原因
3
:
如果将 IIS 设置为使用专用 IP(例如
Web site identification
,可以在 IIS MMC 的 IIS 设置中找到这一选项),则可能看到这条错误消息。在这种情况下,需要更改项目名,直接使用 IP 地址。对于现有项目,需要更改项目以使用 IP 地址,而不用通过编辑 .sln 文件和 .webinfo 文件使用机器名。
原因
4
:
web.config 文件的 中的值太大。默认单位是千字节而非字节,因此如果更改此数字,使用了错误的单位,则可能导致调试问题。
消息:访问被拒绝。
图
14.
访问被拒绝
原因:
您可能是
Debugger Users
组的成员,但是您不具有调试 aspnet 辅助进程的权限,因为您不是
aspnet
用户帐户或
Administrators
组的成员。将您的用户帐户添加到机器上的
Administrators
组即可解决此问题。
无法使用包括文件进行调试
在 ASPX 中,无法使用包括文件进行调试。将旧的 ASP 项目转换为 ASPX 时,往往产生包括文件。
如果通过 包括文件,则可能无法正确调试该包括文件。您需要使用 来代替。
更改密码后,需要注销
/
登录才能进行
ASP.NET
调试。
更改密码后,需要注销,然后再登录才能正确进行 ASP.NET 调试。
安装
Windows2000 SP4
后,
ASP.NET
调试不能运行,同时显示消息
“
访问被拒绝
”
。
此问题的解决方法是,使用
regsvr32 –i aspnet_isap.dll
重新注册
aspnet_isap.dll
。
仅在首次加载页面时遇到断点。
针对这一特定问题,可能存在多种原因,但是最大的可能性是您在
web.config
文件中设置了页面缓存选项。
如果在
web.config
中看到类似于 的内容,则需要将值设置为“False”,以关闭 Web 页面缓存。更改该设置并刷新页面后,可能遇到断点。
您需要共享
Web
服务器以进行调试,但是不想让其他用户成为计算机管理员。
在 Visual Studio .NET 中,以下二者可以确定用户是否可以进行调试。其中之一是
Debugger Users
组,另一个是用户权限,如管理员、Power User 或 SEDebug。
Debugger Users 组确定用户是否可以访问 VS 调试组件(主要是 MDM-Machine Debug Manager,Visual Studio 的一部分),所以成为该组的成员意味着保证可以访问 MDM。因此在这一点上,您可以调试开放进程并查看机器上的进程列表。
不过在此之后,您是否可以调试其他用户的进程取决于您的权限。例如,如果您想调试别人的本地进程,则需要具有 SEDebug 权限.针对其他用户的托管进程,您应该是该机器上的管理员,才有权进行调试。
因为存在这一限制,所以在您的方案中,应该授予学生管理员权限。否则,默认情况下无法对 ASP.NET 辅助进程进行调试。
我们有一种变通方法。Cassini 是一个独立的小型 ASP.NET 服务器。对学生来说,他们可以使用 Cassini 进行开发,稍后将开发结果部署到实际服务器上来提交结果。Cassini 位于
这些案例基于
Console application
项目类型。
消息:无法启动调试。
图
15.
无法启动程序
确保正确启动
Machine Debugger Manager
服务,并且确保您是
Debugger Users
或
Administrators
的成员。
我可以启动托管调试,但是
PDB
不加载,并且不能遇到任何断点。
如果正确启动了调试器,但不能遇到任何断点,则您可能需要检查
diasymreader.dll
的安装。可能没有注册该文件。要注册该文件,需要执行以下操作:
regsvr32 \diasymreader.dll
托管调试不运行
在进程创建 CLR 对象前,以 CLR 模式连接本地进程。托管调试不运行。
解决方案 1:在进程中使用了 CLR 代码后再连接进程。
解决方案 2:以 InterOp 模式连接进程。在这种情况下,不必在调用 CLR 代码之后再连接进程。
托管调试器不响应
使用托管代码启动调试时,调试器不响应。
解决方案:确保已停止并禁用 .NET FrameworkSupport 服务(仅停止该服务还不够)。
如果没有运行 .NET FrameworkSupport 服务,则禁用 IIS admin 服务。
使用 C# 代码单步调试不正确
考虑以下代码:
string someStr;
someStr = "SomeValue";
if(someStr == null)
Console.WriteLine("what's up?");
catch(Exception e)
如果使用此代码,则会看到遇到“if”语句时,指令指针将移动到“if”语句体 (Console.WriteLine("what's up?");)。
这不是一个调试器 bug,而是一个众所周知的 try catch 块调试信息问题。请参见以下调试器中 try catch 块示例的反汇编代码。
if(someStr == null)
a cmp dword ptr [ebp-18h],0
e jne C
Console.WriteLine("what's up?");
mov ecx,dword ptr ds:[01C50070h]
call dword ptr ds:[02F0257Ch]
c jmp
catch(Exception e)
e mov dword ptr [ebp-1Ch],eax
call C0846
值没有匹配时,指令指针移动到 0000003c jmp 行,但是该行已经错误地与“if”语句体相匹配。当代码功能正确时,显示就不正确了。
因果性调试:Web 服务客户端和 Web 服务之间的步骤
无法从 Web 服务客户端到 Web 服务设置调试
默认设置不允许从 Web 服务客户端进入 Web 服务。它的运行方式类似 step-over。
ASPNET 辅助进程(aspnet_wp.exe 或 w3wp.exe)在“aspnet”或“network service”用户帐户之下运行,而这些帐户没有通过 DCOM 访问 MDM 的权限。因此,需要将这些帐户添加到 Debugger Users 组中。
启用 Web 服务模拟后,无法再使用因果性步骤。
使用“web.config”为 Web 服务启用模拟时,不能从 Web 服务客户端代码进入 Web 服务代码。因为,它的运行方式类似于 step over。
您需要执行以下操作来更正客户端和服务之间的步骤。
关闭 IIS 中的 Anonymous access。
更改客户端代码,将凭据设置为 Web 服务,如下所示:
Service1 obj = new Service1();
obj.Credentials = System.Net.CredentialCache.DefaultCredentials;
在此之后,您将能够从客户端进入 Web 服务。
这些操作是必需的,因为当您进入 Web 服务时,某些 .NET Framework 组件需要使用系统级调试器组件 (MDM) 来共同创建它。如果不能提供正确的凭据,则此步骤将失败。如果没有这些正确的凭据,“step into”的运行将类似于“step over”。
调试器挂起
如果 Web 服务客户端代码在 STA (Single Thread Apartment) 模型中运行,并且它在等待异步调用完成,如下所示:
Service1 obj = new Service1();
System.IAsyncResult ar = obj.BeginHelloWorld(new System.AsyncCallback(Class1.Handle),obj);
while(ar.IsCompleted != true)
System.Threading.Thread.Sleep(1000);
则调试器将挂起。发生此挂起操作,原因在于调试器中的代码已锁定一个调试器组件。解决方案 1 是更改代码以使用与事件或 mutex 同步的线程。另一个解决方案是注销 csm.dll。第二个解决方案禁用 causality 步骤(从 Web 服务客户端代码到 Web 服务方法的步骤)。您可能需要手动连接 aspnet_wp.exe 才能调试 Web 服务。
无法查看远程机器上的任何进程
确保在远程机器上安装了 Remote full debug 设置,并且您是 Debugger Users 组的成员。
因 RPC 问题而无法连接到远程机器
以下信息摘自 Mike Clay 撰写的 KB 文章。
如果通过“Processes”对话框连接到远程机器上时看到以下错误消息:
Error while trying to run project: Unable to start debugging on the
web server. Not enough storage is available to complete this operation.
或者在进行 ASP.NET 调试期间看到这一消息:
Error while trying to run project: Unable to start debugging on the web
server. Unable to map the debug start page URL to a machine name.
则确保 RPC 在您的机器与远程机器之间正确运行。下面的行为可能导致 RPC 问题:
通过防火墙进行调试。Microsoft 不建议或支持通过防火墙的远程 ASP.NET 调试。解决此问题最好的方式是,使用“终端服务”登录远程服务器并在本地进行调试。
RPC 的一种常见故障是无力解析远程机器名。RPC 依靠名称解析在计算机之间通信。如果未能将远程服务器机器名解析为正确的 IP 地址,则可能发生错误。
RPC 通信只能单向流动,另一个方向却不行。RPC 通信必须能够从用于调试的机器到达远程服务器,并从远程服务器返回用于调试的机器,这样才能成功进行远程调试。确保以双向方式启用 RPC 通信。
要分析 RPC,可以使用 RPCPing 工具。
远程调试工作组中的机器失败
当您的两台 Windows XP Pro 机器都不在域中但在工作组中时,将发生这种情况。在它们之间进行远程调试时,您根本无法访问远程机器。
在工作组环境中,您需要确保两台机器具有相同的用户帐户名和相同的密码。否则,DCOM 进行身份验证时将失败。
另外,在 Windows XP Pro 上,将 Sharing and security model for local accounts 的默认安全设置设置为现在允许共享。下面是更改此设置的步骤:
运行管理员工具中的 Local Security Settings。
选择 Security settings\Local policies\Security 选项。
将 Network access : Sharing and Security model for local accounts 从 Guest only - local users authenticate as Guest 更改为 Classic - local users authenticate as themselves。
重新启动计算机。
应该将此更改应用于进行远程调试的两台机器。
更改设置后,即可使用同一名称的用户帐户在两台机器上进行远程调试。请确保每台机器上的用户帐户都具有密码。在某些情况下,没有实际密码机器不能运行。
然而,因为更改了安全模型的默认设置,所以可能公开下面的内容:
意外的文件共享
意外的 DCOM 组件共享。
在进行这一更改之前,从远程机器到您的机器的任何种类的连接都是以 Guest 身份进行的;但更改后,他/她即可接受使用本地用户帐户的身份验证。因此,在调试案例中,如果将一个文件夹或 DCOM 对象共享出来,其他机器上的任何匹配用户(具有相同用户名和相同密码)都可能可以访问您的共享对象。
我极力建议,如果您要使用这一变通方法,则请确保所有用户帐户都具有强密码,否则应该设置一个网络孤岛来调试机器,以防止恶意攻击。