在Unity里打开泄漏检查的全堆栈显示

如果 unity 老是报错: A Native Collection has not been disposed, resulting in a memory leak. Enable Full StackTraces

此时需要打开泄漏检查的全堆栈显示(比较耗费性能,平时不要打开)

方法如下:在Editor中加入一个类文件,内容如下:

using System.Linq;
using System.Collections;
using UnityEngine;
using UnityEditor;
using Unity.Collections;

namespace Assets.Scripts.Editor
{
    public class MyJob
    {
        [MenuItem("Custom/MyJobs/Show Leak Detection Mode")]
        static void ShowLeakDetection()
        {
            EditorUtility.DisplayDialog("内存泄漏检测设置", string.Format("NativeLeakDetection.Mode:{0}", NativeLeakDetection.Mode.ToString()), "OK");
        }

        [MenuItem("Custom/MyJobs/Leak Detection Enabled")]
        static void LeakDetectionEnabled()
        {
            NativeLeakDetection.Mode = NativeLeakDetectionMode.Enabled;
        }

        [MenuItem("Custom/MyJobs/Leak Detection Enabled", true)]  //第二个参数表示本函数是菜单是否可用的验证函数
        static bool ValidateLeakDetectionEnabled()
        {
            return NativeLeakDetection.Mode != NativeLeakDetectionMode.Enabled;
        }

        [MenuItem("Custom/MyJobs/Leak Detection Enabled With StackTrace")]
        static void LeakDetectionEnabledWithStackTrace()
        {
            NativeLeakDetection.Mode = NativeLeakDetectionMode.EnabledWithStackTrace;
        }

        [MenuItem("Custom/MyJobs/Leak Detection Enabled With StackTrace", true)]  //第二个参数表示本函数是菜单是否可用的验证函数
        static bool ValidateLeakDetectionEnabledWithStackTrace()
        {
            return NativeLeakDetection.Mode != NativeLeakDetectionMode.EnabledWithStackTrace;
        }

        [MenuItem("Custom/MyJobs/Leak Detection Disable")]
        static void LeakDetectionDisable()
        {
            NativeLeakDetection.Mode = NativeLeakDetectionMode.Disabled;
        }

        [MenuItem("Custom/MyJobs/Leak Detection Disable", true)]  //第二个参数表示本函数是菜单是否可用的验证函数
        static bool ValidateLeakDetectionDisable()
        {
            return NativeLeakDetection.Mode != NativeLeakDetectionMode.Disabled;
        }
    }
}

这样就给Unity编辑器的菜单里增加 Custom/MyJobs 菜单,可随时启用、禁用内存检测。

参考来源: 【修复】A Native Collection has not been disposed, resulting in a memory leak._VirtualCreator的博客-优快云博客

### 问题分析 Unity Profiler 在打开时崩溃可能是由多种原因引起的,包括项目资源过大、脚本错误、插件冲突、内存泄漏Unity 编辑器本身的 bug。以下是常见的可能原因和解决方法。 --- ### 可能原因与解决方案 1. **项目资源过多或性能过载** - 如果项目中存在大量资源(如纹理、模型、动画)或实时生成的数据,可能会导致 Profiler 加载时占用过多内存而崩溃。 - 解决方案: - 减少同时加载的资源数量。 - 使用 `Profiler.BeginSample` 和 `Profiler.EndSample` 对关键代码段进行局部性能分析,避免局性能数据过载[^1]。 2. **脚本逻辑异常或无限循环** - 脚本中可能存在未处理的异常或死循环,导致 Profiler 无法正常采集数据。 - 解决方案: - 检查所有 `Update`、`FixedUpdate` 和协程中的逻辑。 - 确保没有在 Profiler 采样期间触发异常操作,例如空引用访问或非法类型转换。 3. **第三方插件或自定义编辑器脚本冲突** - 某些第三方插件或自定义的编辑器脚本可能在 Profiler 启动时注入了不兼容的代码逻辑。 - 解决方案: - 尝试在干净的新项目中复现问题,逐步添加插件以排查冲突源。 - 更新插件到最新版本,确保其兼容当前使用的 Unity 版本。 4. **Unity 编辑器 Bug 或版本缺陷** - 某些 Unity 版本在 Profiler 功能上存在已知问题,尤其是在早期版本中。 - 解决方案: - 升级到最新的稳定版本(如 2021 LTS 或更高)。 - 查阅 Unity 官方论坛或 Issue Tracker,确认是否存在类似报告。 5. **缓存或配置文件损坏** - Unity 编辑器的本地缓存或偏好设置文件可能已损坏,导致 Profiler 初始化失败。 - 解决方案: - 清除 Editor 缓存:删除 `Library/EditorCache` 文件夹。 - 重置用户设置:删除 `UserSettings/Editor-<version>.yaml` 文件。 6. **GPU Profiling 导致崩溃** - 如果启用了 GPU Profiling 功能,某些显卡驱动或图形 API(如 Vulkan)可能导致 Unity 崩溃。 - 解决方案: - 在 Profiler 设置中禁用 GPU Profiling。 - 更新显卡驱动至最新版本。 --- ### 日志排查建议 - 打开 Unity 编辑器日志(可通过菜单 `Help > Show Log in Explorer` 找到日志路径)。 - 检查日志中是否有 `Native stack trace` 或 `Managed stack trace` 提示,定位崩溃前的调用堆栈。 - 如果发现 `OutOfMemoryException` 或 `AccessViolationException`,则需重点检查资源加载和脚本逻辑。 --- ### 示例:局部启用 Profiler 避免系统性崩溃 ```csharp using UnityEngine; using UnityEngine.Profiling; public class SafeProfilerUsage : MonoBehaviour { void Start() { // 仅在开发环境下启用 Profiler if (Application.isEditor && !Application.isPlaying) { Profiler.BeginSample("Safe Sample"); PerformHeavyOperation(); Profiler.EndSample(); } } void PerformHeavyOperation() { for (int i = 0; i < 100000; i++) { Vector3 temp = new Vector3(i, i, i); } } } ``` --- ### 总结 Unity Profiler 在打开时崩溃通常与资源负载、脚本逻辑、插件兼容性或 Unity 本身的问题有关。通过逐步排查、清理缓存、更新版本以及合理使用 Profiler 的采样机制,可以有效缓解此类问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值