.NET Framework 2.0 中的调试 API 更改

本主题说明在使用公共语言运行时 (CLR) 调试 API 时应该注意的 .NET Framework 2.0 版中的一些更改。

API 更改

  • CorDebug 不再是组件类。 请在承载 API 中使用 CreateDebuggingInterfaceFromVersion 全局静态函数,而不是进行协同创建。 调试器版本应该是 CorDebug.idl 内的 CorDebugInterfaceVersion 枚举中的常量之一。 (如果调试器支持 .NET Framework 2.0,请使用 CorDebugVersion_2_0 常量。)请在承载 API 中使用 GetVersionFromProcess 全局静态函数来获取正在运行的进程的调试对象版本。 或者可以在承载 API 中使用 GetRequestedRuntimeVersion 全局静态函数,以便最准确地推测出将为磁盘上的给定 .exe 文件加载的版本,或者请用户挑选运行时版本。 (您可以在承载 API 中使用 GetRequestedRuntimeInfo 全局静态函数,以确定用户提供的字符串是否为有效版本)。所有这些函数均在 MSCorEE.idl 中定义。

  • 调试器必须实现 ICorDebugManagedCallback2 接口以便被识别为支持 .NET Framework 2.0 的调试器。

  • ICorDebugEnum 的返回值在 .NET Framework 2.0 中符合 COM 标准。

  • ICorDebugInternalFrame 对象可能会出现在堆栈跟踪中,运行时在堆栈跟踪中插入了特殊帧以完成某个任务。 这些框将不会响应 ICorDebugNativeFrameICorDebugILFrame 接口的 QueryInterface 查询。

  • ICorDebugController::Stop 方法超时被忽略。

  • 只有首先加载模块,然后才可以使用 ICorDebugModule::EnableJITDebugging 方法。 如果此方法用于在 attach 操作过程中发出的 ModuleLoad 回调,则它将失败。 (此限制可以确保模块对于其所有函数都具有一致的代码。)

  • .NET Framework 中给定函数的本机代码可能不在一个连续的内存块中。 因此,调试器不应该再使用 ICorDebugCode 接口的 GetAddress, GetSize 和 GetCode 方法。 而是应该使用 ICorDebugCode2::GetCodeChunksICorDebugProcess::ReadMemory

  • 混合模式的调试器必须使用新的 ICorDebugProcess2::SetUnmanagedBreakpoint 方法来设置非托管的断点。

  • 本机线程退出调试事件在 .NET Framework 2.0 带外。

  • 调试 API 中的对象将会更加严重地失效。 在 .NET Framework 1.0 或 1.1 中成功的操作如果在 .NET Framework 2.0 中返回 CORDBG_E_OBJECT_NEUTERED,则执行此操作的接口已经超出了其生存期并且应该被重新获得。 在 .NET Framework 1.0 和 1.1 中通过操作获得的值可能一直都不正确。

泛型

在 .NET Framework 2.0 中引入的泛型否定了调试器在早期版本中做出的许多假设。 调试器应该转变为使用以下识别泛型形式的 ICorDebug 函数:

请参见

概念

CLR 调试概述

其他资源

调试(非托管 API 参考)