UE4SS项目中监视器功能导致游戏退出时崩溃问题分析
问题概述
在UE4SS项目3.0.1版本中,当用户使用监视器(watch)功能并启用日志记录到文件时,游戏退出过程中会出现崩溃问题。同时,监视器收集的数据也无法正确写入日志文件。这个问题主要影响使用Deep Rock Galactic游戏和Unreal Engine 4.27引擎的用户。
技术背景
UE4SS是一个强大的Unreal Engine 4脚本系统,它提供了监视器功能,允许开发者实时监控游戏中的属性和函数调用。监视器功能可以将监控到的数据输出到GUI界面或记录到文件中,对于游戏调试和逆向工程非常有用。
问题详细分析
崩溃原因
经过技术分析,崩溃的根本原因是监视器处理过程与游戏关闭流程之间的时序冲突。当游戏开始关闭时,UE引擎会开始释放各种对象,而此时监视器可能仍在尝试访问这些即将被释放的对象(如被监视的函数或属性),导致访问违规和崩溃。
具体表现为:
- 游戏退出流程启动
- UE引擎开始释放对象
- 监视器线程仍在运行并尝试访问这些对象
- 由于对象已被释放,导致非法内存访问而崩溃
日志记录功能失效
日志记录功能失效的原因在于原始实现仅针对属性(Property)进行了完整实现,而对函数(Function)的日志记录支持不完整。当用户监视函数调用时,虽然GUI界面能正常显示数据,但日志记录功能并未实际执行。
解决方案
崩溃问题解决方案
针对崩溃问题,技术团队提出了几种可能的解决方案:
-
使用对象删除监听器锁(FUObjectArray::UObjectDeleteListenersCritical):
- 这个锁在UObjectArray关闭时会被锁定
- 相对容易实现,因为UE4SS已经实现了FUObjectArray相关功能
- 需要在UVTD中添加相应支持
-
使用垃圾回收同步锁(FGCCSyncObject::Critical):
- 这是更底层的解决方案
- 但实现难度较大,不易直接访问
-
优化监视器关闭时序:
- 在游戏开始关闭前主动停止所有监视器
- 确保监视器处理在对象释放前完成
日志功能完善
技术团队已经完善了日志记录功能,使其支持:
- 函数调用的日志记录
- 结构体属性(StructProperty)的监视
- 数组属性(ArrayProperty)的监视
现在每个监视器都会生成独立的日志文件,而不是全部写入同一个watches.meta.json文件(该文件仅用于存储自动创建监视器的元数据)。
最佳实践建议
对于使用UE4SS监视器功能的开发者,建议:
-
定期保存重要数据:不要依赖游戏退出时的自动保存,重要数据应手动保存。
-
监视复杂类型时:
- 结构体和数组属性现在已支持,但需注意性能影响
- 复杂类型的监视可能会产生大量日志数据
-
崩溃预防:
- 在退出游戏前,手动关闭所有活跃的监视器
- 避免监视引擎核心对象,这些对象往往最先被释放
-
日志管理:
- 注意日志文件会随监视器数量增加而增多
- 定期清理不需要的日志文件
总结
UE4SS的监视器功能是一个强大的调试工具,但在游戏退出流程中存在稳定性问题。技术团队已经通过多项改进增强了其可靠性,包括完善日志记录功能和解决崩溃问题。开发者在使用时应了解这些技术细节,以充分发挥监视器功能的优势,同时避免潜在问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



