我有一些代码偶尔会出现难以重现的意外行为。我正试图通过运行来看看发生了什么:
node --inspect client.js
它为我提供了一个我点击的网址,然后Chrome就会出现一个控制台。现在我等待遇到坏状态,然后我想检查main.js中的各种变量的值(这是我可以挖掘的术语中的其他对象),以便试图找出正在发生的事情。
然而,我看不到任何变数!我可以看到global
范围,但它的代码中没有变量。如何在不必考虑太远的情况下反省我的程序状态,即我可以将一些变量暴露给全局范围并希望不会产生任何副作用,但是如果问题发生在某个地方我怎么办?不想揭露?我想要设置一切,只需运行一次,因为这是一个相当困难的重现问题,并且可能需要花费大量时间,所以一旦进入这种状态,我必须能够做我需要找到的一切问题而不会失去当前的程序状态。
编辑:同样要添加,放置断点不一定有用,因为一切都是事件驱动的,这些并不能保证我可以触发事件,或者它不会以干扰尝试的方式改变状态确定程序处于错误状态的原因,或者我可以从事件发生的范围看到我需要查看的范围。
更新:我尝试在主模块中添加一些代码,然后导出所有顶级变量:
global.main=module
module.exports = {
var1:var1,
...
var99:var99
}
这部分似乎工作正常,但我仍然无法访问对象的内部状态。为了实现这一点,我尝试为每个对象添加一个调试函数,它只需要一个调试器语句来停止调试器,如下所示:
function SomeOjbect(...) {
var me = this
...
me.debug = function() {
console.log("In debugger")
debugger
}
...
}
理论是,此时关闭对象的所有局部变量都是可检查的。但是,当我点击调试语句并获得断点时,检查工具完全忽略了我检查对象中变量的所有努力 - 在控制台中我没有输出,只是另一个提示,而在我输入后的监视窗口中变量和命中输入它完全消失,好像我从未尝试过输入一个新变量。即使我在点击调试器之前在代码中提到变量的名称以试图阻止其被优化,例如,这种情况也会发生。当我将上面的代码更改为:
console.log("In debugger")
me;
debugger
我仍然无法检查me
。 (但如果我将me
替换为me;
,它会向控制台打印console.log(me)
!)
更新:实际上,我似乎可以在断点中什么都没有。如果我在控制台中输入console.log("Test")
,它也不会输出任何内容。如果我让代码继续运行,我输入控制台的命令甚至都没有显示在历史记录中,事实上我根本不能再输入任何新命令,它们都会被忽略,有时候会被忽略源选项卡所有源代码都消失了,我几乎必须关闭正在运行的程序并重新开始,因为调试器变得无用。