自定义.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> 替换为目标应用部署中本机组件的路径。
有关这些设置的详细信息,请参阅 用于调试和分析的运行时配置选项。
使用平台的应用启动配置来提供这些设置。
注释
虽然此过程使用探查器机制初始化调试器,但它不会为移动平台上的第三方探查器建立常规用途支持。
创建调试器接口
在目标端组件中,执行以下初始化:
- 加载
libmscordbi动态库并调用其CoreCLRCreateCordbObjectEx导出。 在返回的对象中查询ICorDebug。 - 调用 ICorDebug::Initialize,并使用 ICorDebug::SetManagedHandler 注册托管事件处理程序。
- 使用 ICorDebug::DebugActiveProcess 附加到该应用程序。
为了避免错过早期模块加载和启动事件,请使附加操作与运行时启动协调进行,以确保在 DebugActiveProcess 完成之前,托管执行不会继续。
初始化后,像在其他 Unix 平台上一样使用 ICorDebug 调试器接口。