Skip to content

Latest commit

 

History

History
57 lines (43 loc) · 2.87 KB

File metadata and controls

57 lines (43 loc) · 2.87 KB

Unity Console 堆栈过滤全方案:底层修复 + 非侵入式拦截

English | 中文版

1. 核心概述

在 Unity 开发中,保持 Console 堆栈整洁是提高调试效率的关键。虽然 Unity 官方提供了 [HideInCallstack] 特性,但在实际生产环境中面临两个核心难题:

  1. Unity 原生 Bug:该特性对泛型方法完全失效。
  2. 第三方库不可控:无法在不重新编译的前提下,为第三方 DLL(如 ZLogger)的方法添加过滤特性。

本项目通过“底层 IL 补丁”修复 Bug,配合“反射工具类”实现对第三方库的非侵入式过滤。


2. 基础准备:开启 Unity 原生过滤

在执行任何操作前,必须确保开启了 Console 的 Strip 选项,否则所有的过滤逻辑都不会生效:

  1. 打开 Console 窗口。
  2. 点击右上角 三个点菜单 (⋮)
  3. 勾选 Strip Logging Callstack

3. 核心步骤一:底层修复 (修复 Unity 泛型过滤 Bug)

Unity 内部在处理参数时错误使用了 Split(','),导致泛型参数中的逗号破坏了方法签名校验。只有完成此修复,后续的工具才能支持泛型过滤。

3.1 备份与路径

修改前请务必备份 UnityEditor.CoreModule.dll 文件:

  • Windows: <Unity安装目录>/Editor/Data/Managed/UnityEngine/UnityEditor.CoreModule.dll
  • macOS: /Applications/Unity/Hub/Editor/<版本号>/Unity.app/Contents/Managed/UnityEngine/UnityEditor.CoreModule.dll

3.2 修改流程

  1. 反编译:使用 dnSpy 以管理员身份打开该 DLL。
  2. 定位目标:找到 UnityEditor.ConsoleWindow -> GetCallstackFormattedSignatureFromGenericMethod
  3. 执行 IL 操作image1
    • 找到调用 getSuccess() 下方的 br 指令位置。 image1
    • 找到 get_Value() 上方的 brtrue 指令位置。 image1
    • 将中间的所有代码指令右键修改为 nop
  4. 保存替换:保存 Module 并替换原 DLL,重启 Unity。

4. 核心步骤二:应用层灵活拦截 (CallstackFilterTool)

在修复了底层的泛型识别 Bug 后,可以通过脚本在不修改任何第三方代码的情况下,动态将过滤规则注入 Unity。

使用说明

  1. 安装:将 CallstackFilterTool.cs 放入项目中。
  2. 配置:打开 Edit -> Preferences -> Callstack Filter
  3. 添加规则:输入完整命名空间类名(如 ZLogger.Unity.ZLoggerUnityLoggerProvider)。
  4. 持久化:规则自动保存至 ProjectSettings/CallstackFilters.json

5. 注意事项

  • 环境依赖:工具的泛型过滤功能必须基于 DLL 修改方案才能生效。
  • 版本更新:升级 Unity 版本后,需要重新执行步骤 3 的 DLL 修改。