更新:2007 年 11 月
此主题描述公共语言运行库 (CLR) 调试 API 如何处理典型的调试方案。请注意,CLR 直接支持某些方案,并且可与当前方法进行互操作来支持其他方案。
进程外调试
在进程外调试中,调试器不在所调试的进程中,而在另一个进程中(即在调试对象外部)。此方案减少了调试器与调试对象之间的交互。因此,它可以更准确地描述进程。
CLR 调试 API 直接支持进程外调试。API 将处理调试器与调试对象托管部分之间的所有通信以支持托管代码调试。
虽然 CLR 调试 API 用于进程外,但某些调试逻辑(例如线程同步)却与调试对象在同一进程内。大多数情况下,这是应该对调试器保持透明的实现详细信息。有关线程同步的更多信息,请参见 CLR 调试体系结构。调试 API 的缺点是在进程外使用时无法用它来检查崩溃转储。
进程内调试
在 .NET Framework 1.0 和 1.1 版中,CLR 调试 API 支持受限的进程内调试,在受限的进程内调试中,探查器可以使用调试 API 的检查功能。在 .NET Framework 2.0 中,进程内调试被替换为一组与分析 API 更加一致的功能。有关这些更改的更多信息,请参见分析概述中的堆栈快照和对象检查功能。
远程进程调试
在远程进程调试中,调试器用户界面与所调试的进程不在同一计算机上。如果由于资源有限、位置限制因素或存在影响操作系统的错误等缘故,在同一计算机上运行调试器和调试对象时调试器会对调试对象产生影响,则此方案可能很有用。
CLR 调试 API 不直接支持远程进程调试。基于 CLR 调试 API 的调试器仍然必须存在于调试对象进程外。因此,此解决方案需要在调试对象所在的计算机上有一个代理进程。
非托管代码调试
由于托管代码可以与非托管代码在同一进程中共存,所以用户经常需要同时调试这两种代码。
CLR 调试 API 不直接支持非托管代码调试。但是,通过共享 Win32 调试功能,它们可以与非托管代码调试器共存。另外,提供了一些功能,用于支持跨越托管代码和非托管代码之间的界限执行单步调试。
此外,CLR 调试 API 为调试进程提供了两种选择方案:
“软附加”选择方案,在此选择方案中只调试进程的托管部分。 软附加到进程的调试器随后可以从该进程中分离出来。
“硬附加”选择方案,在此选择方案中将调试进程的托管和非托管部分,并且通过调试 API 公开所有 Win32 调试事件。
混合语言环境
在组件式软件中,可以用不同的语言构建不同的组件。调试器必须知道代码何时采用不同的语言,以便能够用正确的格式显示数据、用正确的语法对表达式进行求值等等。
CLR 调试 API 不对混合语言环境提供任何直接支持,因为 CLR 没有源语言概念。通过应用调试器的现有源映射功能,应该能够将给定的函数映射到实现该函数所采用的语言。
多个进程和分布式程序
组件式程序可以包括协作组件,这些组件可以在不同的进程上运行,甚至可以在整个网络中的不同计算机上运行。调试器应该能够跟踪进程之间以及计算机之间的执行逻辑,以提供所发生事件的逻辑视图。
CLR 调试 API 不对多进程调试提供任何直接支持。而使用 API 的调试器应该直接提供这类支持,并且用于执行此操作的现有方法应该继续有效。