代码之家  ›  专栏  ›  技术社区  ›  Norem

ChromeDevTools SetVariableValue:如何更改对象属性?阵列单元?

  •  0
  • Norem  · 技术社区  · 2 年前

    如何使用ChromeDevTools更改对象特性?

    我在支持调试器的nodejs上运行了以下代码:

    function test() {
        var obj = {
            "my_prop": 1
        }
        return obj; // <- breakpoint here
    }
    
    while (true) {
        test();
    }
    

    然后,我连接了ChromeDevTools客户端。在第5行设置断点(返回obj),并收到“Debugger.pautend”事件,在该事件中,我试图使用Debugger.setVariableValue更改“obj”对象的“my_prop”属性,如下代码所示:

    var frame = e.CallFrames[0];
    
    var eval = await session.SendAsync(new Debugger.EvaluateOnCallFrameCommand
    {
        CallFrameId = frame.CallFrameId,
        ReturnByValue = false,
        Timeout = 10000,
        GeneratePreview = true,
        IncludeCommandLineAPI = true,
        Silent = true,
        ThrowOnSideEffect = true,
        Expression = "obj"
    });
    
    var objectId = eval.Result.Result.ObjectId;
    
    var set = await session.SendAsync(new Debugger.SetVariableValueCommand
    {
        CallFrameId = frame.CallFrameId,
        ScopeNumber = 0,
        VariableName = "my_prop",
        NewValue = new Runtime.CallArgument
        {
            ObjectId = objectId,
            Value = 900,
            UnserializableValue = "900"
        },
    
    });
    

    但我得到了错误“-32603:内部错误”

    使用此代码成功更改了本地变量

    有人能告诉我我的错误在哪里吗?


    已解决

    我错过了一条重要的评论: “不支持基于对象的作用域”

    我通过Debugger.evaluateOnCallFrame完成了必要的赋值:

    var eval = await session.SendAsync(new EvaluateOnCallFrameCommand
    {
        CallFrameId = frame.CallFrameId,
        ReturnByValue = true,
        Timeout = 10000,
        GeneratePreview = true,
        IncludeCommandLineAPI = true,
        Silent = true,
        ThrowOnSideEffect = false, <- must be false
        Expression = "obj.my_prop=100"
    });
    

    在此之前,选定的属性为 真的 调用这个函数时出错,所以我决定使用Debugger.setVariableValue

    0 回复  |  直到 2 年前