如何在移动平台上初始化自定义调试器

自定义.NET调试器通常托管在单独的进程中。 移动平台限制或禁止创建此类进程,因此必须将目标端自定义调试器组件加载到应用程序进程中。

本文仅适用于 .NET 11 及更高版本中的移动平台(iOS 和 Android)上的调试器初始化。 它不适用于 NativeAOT。

实现和部署目标端组件

目标端调试器组件应作为具有 DllGetClassObject 入口点的探查器动态库实现。 有关示例实现,请参阅.NET探查器示例。

它应与 libmscordbi 和 libmscordaccore 动态库一起部署,作为应用程序的一部分,以符合目标平台的本机库打包、代码签名和加载要求。

启动时加载目标端组件

若要让 CoreCLR 将组件作为探查器加载,请在运行时启动时提供以下环境设置:

环境变量 价值
DOTNET_ENABLE_PROFILING 1
DOTNET_PROFILER {<profiler-CLSID>}
DOTNET_PROFILER_PATH <component-path>

将 <profiler-CLSID> 替换为组件的探查器 GUID,并保留封闭括号。 将 <component-path> 替换为目标应用部署中本机组件的路径。

有关这些设置的详细信息,请参阅 用于调试和分析的运行时配置选项。

使用平台的应用启动配置来提供这些设置。

注释

虽然此过程使用探查器机制初始化调试器,但它不会为移动平台上的第三方探查器建立常规用途支持。

创建调试器接口

在目标端组件中,执行以下初始化:

  1. 加载 libmscordbi 动态库并调用其 CoreCLRCreateCordbObjectEx 导出。 在返回的对象中查询 ICorDebug。
  2. 调用 ICorDebug::Initialize,并使用 ICorDebug::SetManagedHandler 注册托管事件处理程序。
  3. 使用 ICorDebug::DebugActiveProcess 附加到该应用程序。

为了避免错过早期模块加载和启动事件,请使附加操作与运行时启动协调进行,以确保在 DebugActiveProcess 完成之前,托管执行不会继续。

初始化后,像在其他 Unix 平台上一样使用 ICorDebug 调试器接口。