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
相关产品推荐
相关产品推荐

