常规调试
这些案例基于 Console application 项目类型。
消息:无法启动调试。

图 15. 无法启动程序
导致图 15 中所示问题的原因是没有正确注册 mscordbi.dll。此问题的补救办法是手动注册该文件。
消息:无法启动调试。访问被拒绝。

图 16. 拒绝访问错误消息
确保正确启动 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?");
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; |