ASP.NET调试问题与解决[3]

[入库:2006年2月23日] [更新:2007年3月24日]

本文简介:

常规调试

这些案例基于 Console application 项目类型。

消息:无法启动调试。


15. 无法启动程序

导致图 15 中所示问题的原因是没有正确注册 mscordbi.dll。此问题的补救办法是手动注册该文件。

消息:无法启动调试。访问被拒绝。


16. 拒绝访问错误消息

确保正确启动 Machine Debugger Manager 服务,并且确保您是 Debugger UsersAdministrators 的成员。

我可以启动托管调试,但是 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?"); 

try 
{ 
} 
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 
 jmp        

} 
 nop      

值没有匹配时,指令指针移动到 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;

本文关键:ASP.NET调试问题与解决
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top