如何通过单声道调试线获取静态属性值?

问题描述 投票:0回答:1

我正在尝试通过 Mono Debugger Wire Protocol 控制 Unity Editor。我想获得

public static
property 的价值。 以下是片段:

using VirtualMachine = Mono.Debugger.Soft.VirtualMachine;

// vm points to the virtual machine of the Unity Editor
internal void SomeWhat(VirtualMachine vm) {
    var hierarchyWindow = vm.GetTypes("UnityEditor.SceneHierarchyWindow", false)!.Single()!;
    var prev = hierarchyWindow.GetMethod("SelectPrevious")!;
    var latestWindow = hierarchyWindow
        .GetProperty("lastInteractedHierarchyWindow")
        .GetGetMethod(false)
        .Evaluate(null, new Value[] { });
    
    prev.Evaluate(latestWindow, new Value[] {});
}

但是,它会抛出

System.NotSupportedException

Unhandled exception. System.NotSupportedException: Specified method is not supported.
   at Mono.Debugger.Soft.ILInterpreter.Evaluate(Value this_val, Value[] args) in $PROJECT/deps/debugger-libs/Mono.Debugger.Soft/Mono.Debugger.Soft/ILInterpreter.cs:line 43
   at Mono.Debugger.Soft.MethodMirror.Evaluate(Value this_val, Value[] args) in $PROJECT/deps/debugger-libs/Mono.Debugger.Soft/Mono.Debugger.Soft/MethodMirror.cs:line 466
   at Blah.SomeWhat(VirtualMachine vm) in $PROJECT/$PROJECT_NAME/SandBox/Lib.cs:line $LINE

其中

$PROJECT
$PROJECT_NAME
$LINE
是可变的。

我很困惑,因为它的消息很差,并且 Java 反射中的静态 字段 不需要有效的

this_val
对象。事实证明,目前
this_val
不能为空。

我正在使用 Unity Editor 2019.4.31f1 和 mono/debugger-libs https://github.com/mono/debugger-libs/tree/6fcc6d78446b1fffac12f597099cc3d78dd74ca6,有什么想法吗?

unity-game-engine debugging mono
1个回答
0
投票

ILInterpreter
中的第42行确实检查

if (method.IsStatic || ... || this_val == null || ...) 
   throw new NotSupportedException ();

所以看起来这样——或者至少这样——根本不是为静态而设计的。


因为在这种特定情况下,该属性实际上只是指向静态字段

私有静态SceneHierarchyWindow s_LastInteractedHierarchy;

你可以尝试尝试一下,例如

var fieldInfoMirror = hierarchyWindow.GetField("s_LastInteractedHierarchy");
var latestWindow = hierarchyWindow.GetValue(fieldInfoMirror);
© www.soinside.com 2019 - 2024. All rights reserved.