Mono 功能与托管对象分析

Mono 功能与托管对象分析

CE 提供面向 Mono 运行时的辅助功能,可帮助理解托管类型、方法和字段。本章介绍在自建 Mono 练习程序中观察类型与实例的方法,不假设所有 Unity 程序都支持同一种运行时。

本章是扩展知识:CE 自带的 Tutorial-i386.exe 是原生程序,不能用来演示 Mono 类和托管对象枚举。要实际跟做,需要另有自己有权使用、采用受支持 Mono 运行时的练习目标;没有此目标时,仅阅读概念即可。

先确认运行环境

附加自己运行的 Mono 练习程序,打开 CE 的 Mono 功能并按当前版本菜单启用数据收集;启动时机与功能名称可能因版本变化。若找不到相关菜单或程序集,不应立即认为 CE 故障:程序可能使用不同运行时、尚未加载对应模块,或目标版本不受当前工具支持。IL2CPP 与 Mono 不能简单视为同一种运行时。

在 Mono 浏览器中依次查看程序集、命名空间、类、字段和方法。对照练习程序源代码核实字段名称、类型以及是否为静态字段。类型定义描述布局,实例字段还需要确定具体实例地址;仅知道偏移并不等于掌握所有对象的稳定地址。

从字段到对象

让练习程序创建两个同类对象,分别显示不同数值,然后通过结构视图和已知变化验证每个实例。若两个对象对应同一个方法,断点命中时要观察当前对象指针,不能仅因方法名匹配就修改所有实例。托管对象可能被垃圾回收移动或释放,保存一次观察到的地址不保证永久有效。

方法可能由运行时即时编译;代码地址和可用时机取决于运行状态。重新启动或重新编译后应重新定位。先用字段观察验证,再分析方法调用与指令,任何示例都应和当前版本实际内容对照。

排查与边界

若字段值与显示不一致,检查是属性计算结果、缓存、副本还是类型解释不正确。若类型可见但没有对应实例,确认对象已经创建且尚未销毁。不要把结构偏移、JIT 结果或者某个模块名称视为跨程序通用配置。

练习验收:解释一个类中实例字段与静态字段的区别,能在两个对象间区分独立数值,并在重启练习进程后重新完成定位。没有读取或写入权限时,应回到自己可控制的练习进程,而不是尝试绕过目标限制。

阅读结果时还应检查字段的声明类与继承关系:同名字段可能出现在不同类型,字段值的偏移也要以当前运行环境为准。记录完整类型名,能帮助下次分析时避免选中名称相似但不同的对象。

参考资料