关于使用VS.Net2003调试器出现的问题及相关解决方法[转]
原文地址:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/vsdebug.asp
一些有用的信息被我翻译了,放在这里以后可能用的上
消息1:无法在服务器上启动调试(Unable to start debugging on the Web server)
原因1:IIS的应用程序设置并没有使用集成windows认证,打开windows集成认证选项
原因2:检查IIS中的"保持HTTP连接"选项,确保该选项为选中状态
消息2:您没有在服务器启动调试的权限(You do not have permission to debug the server)
原因1:确保windows集成认证选项打开
原因2:如果您打开了windows集成认证选项的话,确保您的用户帐号具有对IIS目录的完全控制权
原
因3:如果您的Web项目使用额完整的机器名作为项目名称(machinename.domainname.something)的话,那么这个Web站
点就会被认为是一个Internet站点,所以IE的缺省设置就会影响登陆状态,在这种情况下,您需要在IE设置的Internet区域中允许您使用当前
用户帐户登陆;这并不是IE的缺省设置,所以您最好使用你的机器名称来作为您项目的名字!
消息3:当发送HTTP调试请求时发生服务器端错误(Server side-error occurred on sending debug HTTP request)
原因1:您的Web应用程序可能没有应用程序名称,解决这个问题,您需要使用IIS MMC为您的Web项目分配一个应用程序名称;
原因2:如果您正在使用NTFS文件系统的话,确保aspnet帐户对于wwwroot或您的应用程序文件夹具有适当的读写权限
消息4:当前项目没有被配置为允许调试(The project is not configured to be debugged)
对于这个错误,您需要确保您的Web被配置为调试状态,完成这项工作,您需要在web.config中设置debug=true
原因1:asp.net 调试在项目属性中没有被开启;
原因2:请确认所期望的DLL已经被载入对应的调试符号文件,您可以在模块窗口中检查
消息5:调试器可能没有被安装(The debugger is not properly installed)
如果遇到这样的问题,检查控制台应用程序项目中的调试功能,如果控制台应用程序项目中显示图示的错误信息的话,说明您的.net framework并没有被完全的安装
您需要执行命令"regsvr32 mscordbi.dll"手动注册您的"mscordbi.dll"文件
消息6:服务器不支持asp.net 或 ATL server 应用程序调试
如
果你正使用WindowsXP Pro或是Win2000
Pro的话,您可能要思考一下您安装VS.Net的顺序问题;您如果在安装Vs.Net之后才安装IIS的话,你就会遇到这个错误,在这种情况下,您需要
使用命令"aspnet_regiis.exe –i"来注册"aspnet_isapi.dll"
消息7:访问被拒绝。检查您是否是系统管理员或...组的成员(Access is denied. Verify that you are an administrator or a member of ...)
您的帐户可能不是本机Debugger Users组的成员,将您的帐户加入该组可以解决这个问题;
消息8:无法启动ASP.NET或ATL Server调试
原因1:您可能安装了IIS Lockdown,如果是这样的话,找到urlscan.ini文件,在[allowverbs]节中加入DEBUG(大小写敏感)字段
原因2:如果您正使用域控制器(Domain controller)作为您的服务器,并且您的项目使用了机器器名而没有使用完整的域名的话,您肯能需要改变您项目的Url为使用完整的域名
原
因3:如果您的IIS被设置为使用专用的IP作为Web站点的定位标志(Web site
identification)的话,你肯那个就会遇到这个错误;在这种情况下,您需要改变您的项目名字为直接使用IP地址作为项目名。对于已经存在的项
目,你需要编辑.sln文件和.webinfo文件来改变项目的名字为IP地址
原因4:web.config文件中的<httpRuntime maxRequestLength="#########" />值太大。缺省单位是Kbyte,不是byte,所以如果您使用了错误的单位来改变这个数值的话,可能会导致调试错误!
消息9:访问被拒绝
原因:您可能是Debugger Users组中的成员,但是你没有调试aspnet工作进程的权限,因为您并不是aspnet用户帐户或Administrator组中的成员。将您的用户帐户加入到机器的Administrator组中以解决该问题。
无法对于一个Included File进行调试
ASPX
中,您无法调试一个included file,一个included
fie通常是您从asp项目转向ASPX的结果,如果您使用<!--#include file = "file
name"-->包含文件,您可能不能正确的调试那个包含文件,您需要使用<!--#include virtual="file
name"-->来代替。
在改变了您的密码时,您需要为使用ASP.NET调试进行log off/log in
在安装了Win2000 SP4后,ASP.NET调试无法工作,报错:"访问被拒绝"
解决办法是使用命令"regsvr32 –i aspnet_isap.dll"重新注册aspnet_isapi.dll
只能在页面第一次被加载的时候停在断点处(hit breakpoint)
对于这个问题可能有几种不同
的原因,但是最有可能的原因应该是您在web.config文件中使用了page
cache选项;如果您在web.config中看到了如<add key="<your web project
name".Web.EnablePageCache" value="True"
/>的配置,您需要设置value为False来关闭Web页面缓存,在改变该设置之后,您应该就可以停在断点处了;
您需要共享一个Web服务器来进行调试,但是又不想其他用户能够在该机器上进行管理
在VS.Net中,有两件事情决定是否一个用户可以进行调试,一是Debugger Users组,令一个是用户权限,如administrator,power user 或者 SEDebug
Debugger
Users组决定是否用户可以访问VS调试模块(主要是MDM-Machine Debug
Manager,VS的一个部分),所以作为该组成员意味着您获得了访问MDM的权限,所以您可以调试您的开放进程(open
process)并且可以看到您机器上的进程列表.
但在这之后,您是否可以调试其他用户的进程就决定于您的权限,举例说明:如果您想要调试其他用户的自然进程(native process),您就需要具有SEDebug权限。对于其他用户的托管进程(Managed Process),您需要是该机器的管理员!
由于这样的约束,在这样的情况下,学生们就必须被提升为管理员,如果不这样做的话ASP.NET工作进程在缺省情况下就无法被调试。
常规调试(General Debugging)
这些情况是基于控制台应用程序类型的
消息1:无法启动调试
这个问题时因为没有正确注册mscordbi.dll造成的,重新注册文件就可以解决这个问题
消息2:无法启动调试,访问被拒绝
确保Machine Debugger Manager服务被正确启动,并且您是Debugger Users组中的一员,或是administrator
我可以启动托管调试(Managed debugging),但是PDB并没被加载,所以我无法设置任何断点
如果调试器被正确运行,但是您并没有停在任何断点的话,您可能需要检查diasymreader.dll的安装情况,这个文件可能没有被注册,您需要这样做:
regsvr32 <path to DLL>\diasymreader.dll
托管调试无法工作
您使用CLR模式附加到一个自然进程在该进程还没有创建一个CLR对象时,托管调试就无法工作
解决1:在CLR代码已经被该进程使用后再附加到该进程
解决2:使用InterOp模式附加到该进程,在这种情况下,您不需要在CLR代码被调用以后再附加到该进程
托管调试器无响应
当您针对托管代码启动调试时,调试器无响应
解决:确认 .NET Framework Support 服务被停止并且禁用(仅停止该服务是不够的)
如果您并没有.NET Framework Support 在运行的话,禁止IIS admin服务
对C# 代码使用 Stepping 结果并不正确
看看以下代码:
string someStr;
someStr = "SomeValue";
if(someStr == null)
Console.WriteLine("what's up?");
try
{
}
catch(Exception e)
{
}
如果您对这段代码使用Step的话,您会发现当您进入"if"语句的时候,指令指针(instruction pointer)会移动到Console.WriteLine("what's up?");这句
这并不是调试器的bug,但是这是针对try catch块调试信息的一支问题。看看以下该例子的反编译代码:
if(someStr == null)
0000002a cmp dword ptr [ebp-18h],0
0000002e jne 0000003C
Console.WriteLine("what's up?");
00000030 mov ecx,dword ptr ds:[01C50070h]
00000036 call dword ptr ds:[02F0257Ch]
0000003c jmp 00000048
catch(Exception e)
0000003e mov dword ptr [ebp-1Ch],eax
00000041 call 762C0846
00000046 jmp 00000048
}
00000048 nop
当value并不为真的时候指令指针移动到了0000003c jmp 00000048这一行,但是这行错误的对应了if语句的语句块。所以当执行结果正确时,我们看到的调试过程并不正确!
因果调试:在Web Service 客户端和Web Service之间进行步进(Stepping)
无法从Web Service客户端进入Web Service进行调试
缺省设置下并不允许您从Web Service客户端进入Web Service。
ASPNET工作进程在"aspnet"或"network service"用户帐户下工作,这些帐号并不具有通过DCOM访问MDM的权限。所以,您需要把这些帐户增加进Debugger Users组中
在允许扮演Web Service(impersonation of Web service)之后,您无法做到因果步进
您需要做以下的事情来纠正客户端与服务之间的步进
1.关闭IIS的匿名访问
2.改变客户端代码,设置一个安全证书(credential)给WebService
Service1 obj = new Service1();
obj.Credentials = System.Net.CredentialCache.DefaultCredentials;
调试器挂起
如果您的Web Service客户端代码运行在一个STA(Single Thread Apartment)模型下,并且它正
在等待一个异步调用的完成,如下代码所示:
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就是改变您的代码使用事件进行线程同步或是使用
mutext.其他的解决方案就是注销csm.dll.第二种解决方案就是禁用因果调试。你可能需要手动附加到aspnet_wp.exe来调试Web
Service