启用 Developer Tools Access 会使 Unity 和 Activity Monitor 崩溃

Enabling Developer Tools Access crashes Unity and Activity Monitor

从昨天开始我就遇到了开发者工具问题。我用

我正在重构一些东西,Developer Tools 要求我提供访问权限:Developer Tools Access 需要控制另一个进程才能继续调试。输入您的密码以允许此...

从那以后,发生了两件事。

  1. 如果开发者工具访问已启用(也尝试通过 sudo /usr/sbin/DevToolsSecurity --enable 命令执行此操作)几乎每次我更改代码时, Unity 停止工作(加载轮存在)并且我无法关闭它的应用程序。我尝试使用 Activity 监视器,它没有显示任何活动。我只能看到加载轮。

    我什至尝试通过 kill unitypid 终止 Unity 进程,它 "kills" 进程因为它不在进程列表中,但我仍然可以在我的桌面上看到它,就像关闭一样和以前一样。

    检查 Unity 日志,我可以看到它停止于:

    Begin MonoManager ReloadAssembly
    
    custom-attrs.c:1250: (null) 
       assembly:/Applications/Unity/Hub/Editor/2018.4.17f1/Unity.app/Contents/Managed/UnityEngine/UnityEngine.CoreModule.dll type:UnityException member:(null) signature:<none>
    
    Stacktrace:
    Native stacktrace:
        0   libmonobdwgc-2.0.dylib              0x00000001460b4976 mono_handle_native_crash + 242
    
  2. 如果 Developer Tools Access 被禁用,应用程序会多次要求我启用它。按取消几次后,Unity 崩溃并关闭,让我能够向 Apple 发送日志错误,但有以下例外:

    Exception Type:        EXC_CRASH (SIGABRT)
    
    Exception Codes:       0x0000000000000000, 0x0000000000000000
    Exception Note:        EXC_CORPSE_NOTIFY
    
    Application Specific Information:
    abort() called
    

真的不知道该怎么办。我尝试更新 Rider、Catalina,安装新的 Unity 版本。

更新:我格式化了磁盘并重新安装了Catalina,还是不行。

非常感谢您的帮助!

经过进一步调查,我发现了以下重现:

  • 创建一个派生自 PropertyAttribute 的自定义属性,在其构造函数中调用 AssetDatabase.FindAssets("somethingsomething")
  • 创建一个 class(在我的例子中,它派生自 MonoBehaviour class,以便能够调用构造函数,因为游戏对象放置在场景中)包含具有上述自定义属性的字段。
  • 向该字段添加 FormerlySerializedAs 属性(例如在重构期间)。
  • 创建一个带有您的 class 的游戏对象。

这将导致弹出窗口 window,其中包含我在问题中提到的消息:

Developer Tools Access 需要控制另一个进程才能继续调试。输入您的密码以允许此...

示例:

    using System.Diagnostics;
    using UnityEditor;
    using UnityEngine;

    public class CustomObjectPathAttribute : PropertyAttribute
    {    
        /// <summary>
        /// Default constructor.
        /// </summary>
        public CustomObjectPathAttribute()
        {
            var guids = AssetDatabase.FindAssets("Resources");
        }
    }

using UnityEngine.Serialization;

[System.Serializable]
public class TestClass
{
    /// <summary>
    /// Path to the file.
    /// </summary>
    [FormerlySerializedAs("pathToFile")]
    [CustomObjectPath]
    public string pathToFile2 = string.Empty;
}

using System.Collections.Generic;
using UnityEngine;

public class MyBehaviour : MonoBehaviour
{
    private List<TestClass> testClasses;

    void Start()
    {
        testClasses = new List<TestClass>();
    }
}

MyBehaviour 脚本附加到场景中的游戏对象。项目重新编译后会出现此问题

如果 TestClass 中的字段没有附加 FormerlySerializedAs 属性,则在自定义属性的构造函数中使用 AssetDatabase.FindAssets("Resources") 可以正常工作。

我已将错误报告给 Unity QA 团队,他们成功重现了该问题。这是 Unity 问题跟踪器的 link:https://issuetracker.unity3d.com/issues/crash-when-using-assetdatabase-dot-findassets-in-a-custom-propertyattribute-and-when-formerlyserializedas-attribute-is-also-used

此时除了

我无能为力了
  • 当字段具有自定义 属性 属性时不重构我的字段 附加,
  • 在我的 属性 中没有使用 AssetDatabase.FindAssets 构造函数。

这是 2019 年发生在我身上的事情。3.x

当我在播放模式下测试动画和进行更改时,通常会发生这种情况。

只有重新启动才能解决此问题。