我正在编写一个Node.js应用程序,其中我使用字符串转换的整数作为键(例如“62616324573”)用数据填充对象。对象总是将键{key:}存储为字符串,这与 javascript数组及其[index]的工作方式相比是理想的:
数组定义了一百万次undefined
,定义索引之间的每个索引一次。
但是,我发现我无法正确调试我的新对象,因为Variables
面板中Eclipse
显示Failed to read variables
. 在内部,它们似乎工作正常。
采取以下代码:
var util = require('util');
util.debug('Run this with --debug-brk=port, and press Resume (F8) to break at the breakpoint below.');
var debugMe = {
"1000000000" : {
// "2011743958" : {
"some" : 1234,
"random" : true,
"data" : undefined
},
// "1000000001" : {
// "8302611133" : {
"3302611133" : {
"some" : 12345678,
"random" : false,
"data" : null
}
};
util.debug(JSON.stringify(debugMe)); // Look, it prints fine in all cases. This is internal javascript code.
util.debug('...');
util.inspect(debugMe); // And now it doesn't. This is V8 debugging code.
var breakpoint_here = true; // Set breakpoint here!
// hohoho
设置断点breakpoint_here
并使用即时中断调试器运行它,例如node --debug-brk=5858 debugtest.js
. 按下resume
以从第 1 行跳转到断点。转到您的Variables
面板并尝试检查debugMe
:面板将崩溃。
使用 10..00 和 10..01 再试一次。没问题。除了,从它的写入方式来看,这些数字似乎被解析为数组索引(!)。
debugMe ->
[1000000000] -> [Object]
[1000000001] -> [Object]
现在试试 10..10 和 83..02。突然间,83..33 是普通的JSON key
而不是数组索引,但 10..00 仍然是数组索引。(?)
debugMe ->
8302611133 -> [Object]
[1000000000] -> [Object]
现在尝试 10..00 和 33..33,Variables
窗口将再次崩溃。这是我所期望的:
debugMe ->
1000000000 -> [Object]
3302611133 -> [Object]
这就是我猜测正在发生的事情,尽管在调试仍然合作的对象时您实际上看不到它:
debugMe ->
[1000000000] -> [Object]
[1000000001] -> undefined
// (...) // debugger memory fills up
[3302611132] -> undefined
[3302611133] -> [Object]
我猜测的问题是这种情况下的数字都是数组索引并且差异太大,因为调试器会记住 2302611133 次undefined
,这个问题应该只在array
使用而不是 JSON时存在object
。
- 为什么有些数字作为键(字符串)而另一些作为索引?
- 为什么某些索引组合在调试器中起作用,而另一些则不起作用?
- 在我不知道的情况下,“百万次未定义”问题是否也发生在对象上?
让我回顾一下:
- 字符串转换整数“int”的微小差异似乎工作正常,但在调试器中它们变成 [indices]
- 密钥中高达约十亿的巨大差异不起作用,
Variables
窗口崩溃。没有控制台输出。 - 更大的差异再次起作用,但有些成为[索引],而另一些则保持“关键”。
因为我必须进行手动崩溃测试,所以我花了很长时间才发现问题出在数字上,而不是对象本身的内容上。很难想象问题只影响调试器而不影响应用程序本身,因为它是相同的 (V8) 引擎。我希望有人能指出我遗漏的所有事实和变量。
-更新-
似乎没有人知道这件事。未知的逻辑,也不是已知的错误。我在 Eclipse WDT提交了一个错误,尽管我不确定这是行为的根源。