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

ChromeDevTools SetVariableValue: how change object property? array cell?

提问人:Norem 提问时间:8/31/2023 最后编辑:Norem 更新时间:9/1/2023 访问量:29

问:

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

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

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

while (true) {
    test();
}

然后,我连接了ChromeDevTools客户端。在第 5 行(返回 obj)上设置断点并收到“Debugger.paused”事件,其中我尝试使用 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"
});

在此之前,所选属性为 true,并且在调用此函数时出现错误,因此我决定应该使用 Debugger.setVariableValue

对象 调试 属性 google-chrome-devtools setvalue

评论

0赞 wOxxOm 8/31/2023
文档说“不支持基于对象的范围”,即您需要将 js 代码与 Debugger.evaluateOnCallFrame 一起使用。
0赞 Norem 9/1/2023
非常感谢,您指出我没有正确使用此方法,这使我能够切换到其他方法

答: 暂无答案