You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ChromeDevTools调试:SetVariableValue修改对象属性失败的解决方法

问题

如何使用Chrome DevTools修改对象属性?

我在开启调试支持的Node.js环境中运行以下代码:

function test() {
    var obj = {
        "my_prop": 1
    }
    return obj; // <- 断点位置
}

while (true) {
    test();
}

随后通过Chrome DevTools客户端连接,在第5行(return 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: Internal error,而用此方法修改局部变量却能成功,请问问题出在哪里?

解决方法

问题根源是忽略了一个重要提示:"基于对象的作用域不受支持"

最终通过Debugger.evaluateOnCallFrame实现了赋值操作,代码如下:

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

此前将ThrowOnSideEffect设为true时调用该函数会报错,因此曾误以为应该使用Debugger.setVariableValue。

内容的提问来源于stack exchange,提问作者Norem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 07:30:05