解决在Unity中封装Debug.Log后代码行定位问题

探讨在Unity中封装Debug.Log后的代码行定位问题,分析Unity处理StackFrame的机制,提供一种通过自定义OnOpenAsset实现代码定位的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

解决在Unity中封装Debug.Log后代码行定位问题

众所周知,代码中使用Debug.Log*输出的日志在Unity的ConsoleWindow中可以双击定位到对应的代码行,然而将Debug.Log*封装到自己的日志类中后,定位就失去意义了。原因很简单,Unity只会处理StackFrame的栈顶信息,它们保存在LogEntry中,栈顶的方法对应的脚本文件会以其instanceID来保存,其他StackTrace信息则以字符串结果存储,最终在双击ConsoleWindow中的ListView条目时通过指定了OnOpenAssetAttribute的callback来打开代码编辑器。其中,OnOpenAssetAttribute参数用于处理存在多个Callback时的优先级问题。

image

通过阅读ConsoleWindow代码,想到了一个解决思路:自己实现OnOpenAsset,通过获取ConsoleWindow中的ListView得到当前选中的row,然后在LogEntries中取得该行对应的LogEntry,其中的condition字段保存了StackTrace字符串,最后过滤掉包装的日志类后拿到脚本文件名和代码行,用OpenFileAtLineExternal直接打开。在实现过程中发现,完全没有必要拿到LogEntry,因为ConsoleWindow中的m_ActiveText就是StackTrace字符串,直接处理就好了。

在想到该方案之前,看过两个解决方法:1)将日志类编译成DLL;2)输出日志时自己记录StackFrame,通过一系列手段在OnOpenAsset查找LogEntry中对应的StackFrame。不过这两种方案都不能满足个人的完美主义情节,方案1失去了预编译宏的灵活,一旦日志系统改动需要重编DLL和处理依赖,方案2低效且过于复杂。

最后摘出代码供参考,实现环境为:Unity 4.7.5f1, UnityVS+Visual Studio 2015 Pro

 

众所周知,代码中使用Debug.Log*输出的日志在Unity的ConsoleWindow中可以双击定位到对应的代码行,然而将Debug.Log*封装到自己的日志类中后,定位就失去意义了。原因很简单,Unity只会处理StackFrame的栈顶信息,它们保存在LogEntry中,栈顶的方法对应的脚本文件会以其instanceID来保存,其他StackTrace信息则以字符串结果存储,最终在双击ConsoleWindow中的ListView条目时通过指定了OnOpenAssetAttribute的callback来打开代码编辑器。其中,OnOpenAssetAttribute参数用于处理存在多个Callback时的优先级问题。

image

通过阅读ConsoleWindow代码,想到了一个解决思路:自己实现OnOpenAsset,通过获取ConsoleWindow中的ListView得到当前选中的row,然后在LogEntries中取得该行对应的LogEntry,其中的condition字段保存了StackTrace字符串,最后过滤掉包装的日志类后拿到脚本文件名和代码行,用OpenFileAtLineExternal直接打开。在实现过程中发现,完全没有必要拿到LogEntry,因为ConsoleWindow中的m_ActiveText就是StackTrace字符串,直接处理就好了。

在想到该方案之前,看过两个解决方法:1)将日志类编译成DLL;2)输出日志时自己记录StackFrame,通过一系列手段在OnOpenAsset查找LogEntry中对应的StackFrame。不过这两种方案都不能满足个人的完美主义情节,方案1失去了预编译宏的灵活,一旦日志系统改动需要重编DLL和处理依赖,方案2低效且过于复杂。

最后摘出代码供参考,实现环境为:Unity 4.7.5f1, UnityVS+Visual Studio 2015 Pro

 

### 项目中出现 `debug.log` 文件的原因 在软件开发过程中,尤其是涉及 Node.js 或 Unity 的环境中,`debug.log` 文件通常是由调试工具或框架自动生成的日志文件。以下是具体原因: 1. **Node.js 环境下** 在某些情况下,Node.js 及其相关模块可能会生成日志文件用于记录运行时错误或其他信息。例如,当安装依赖项失败或者缓存出现问题时,Node.js 会在指定路径下生成类似的日志文件[^1]。 2. **Unity 开发环境** 在 Unity 中,默认的 `Debug.Log()` 方法会将消息输出到控制台,并可能写入本地磁盘上的日志文件(如 `Player.log`)。如果未正确配置日志管理机制,则可能导致不必要的日志堆积[^3]。 3. **操作系统层面的影响** Windows 10 用户有时也会遇到随机生成的 `debug.log` 文件问题。这可能是由于 Chromium 浏览器引擎中的 Bug 所致,该问题会影响基于 Chromium 构建的应用程序(如 Chrome 和 Edge),从而在其工作目录中留下多余的日志文件[^5]。 --- ### 如何处理 `debug.log` 文件 针对不同场景下的解决方案如下: #### 对于 Node.js 项目 可以按照以下步骤清理并预防此类问题的发生: - 删除报错信息中提到的具体日志文件位置:`C:\Program Files\nodejs\node_cache_logs\**\**-debug.log`。 - 移除项目根目录下的 `node_modules` 文件夹以重新构建干净的依赖关系。 - 同时删除 `package-lock.json` 文件以便更新锁定版本号至最新状态。 #### 关闭 Unity 运行时日志功能 为了优化性能和保护隐私数据安全,在正式发布前应禁用所有的打印语句操作。可以通过以下方式实现这一目标: - 封装原始 API 调用逻辑,仅保留特定条件下的有效行为;比如定义全局开关变量来判断当前所处模式是否允许显示提示信息[^4]。 ```csharp public static class CustomLogger { private const bool IsLoggingEnabled = false; public static void Log(string message){ if(IsLoggingEnabled){ UnityEngine.Debug.Log(message); } } public static void LogWarning(string warningMessage){ if(IsLoggingEnabled){ UnityEngine.Debug.LogWarning(warningMessage); } } public static void LogError(string errorMessage){ if(IsLoggingEnabled || true /* Always show errors */ ){ UnityEngine.Debug.LogError(errorMessage); } } } ``` #### 处理 Win10 桌面上无故产生的 debug 日志现象 如果是因第三方应用引起的干扰情况,则需定位确切源头再采取针对性措施。一般建议尝试升级对应客户端版本修复已知漏洞或是调整权限设置阻止非法访问活动发生。 --- ### 总结 通过上述分析可以看出,无论是前端还是后端领域都存在类似需求即合理管控各类冗余记录以免造成资源浪费甚至安全隐患风险增加等问题。因此有必要建立完善的管理制度规范日常作业流程减少意外状况发生的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值