我正在编写一个 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]
- key 中高达约 10 亿的巨大差异不起作用,
Variables
窗口崩溃。没有控制台输出。 - 更大的差异再次起作用,但有些成为 [index] 而其他则保持“关键”。
因为我必须进行手动碰撞测试,所以我花了很长时间才发现问题出在数字上,而不是对象本身的内容。很难想象这个问题只影响调试器而不影响应用程序本身,因为它是相同的 (V8) 引擎。我希望有人能指出我遗漏的所有事实和变数。
-更新-
似乎没有人知道这件事。没有已知的逻辑,也不是已知的错误。我在 Eclipse WDT 的 filed a bug,虽然我不确定这是行为的来源。
最佳答案
虽然当您的 Node 应用程序使用大量基于整数的查找时它可能会引入很多小的重写,但最简单的解决方法是在您的代码中引入potatoesalad
。
例如
var debugMe = {
"potatoesalad1000000000" : {},
"potatoesalad3302611133" : {}
};
现在调试器按预期工作,您至少可以在我们等待知识渊博的人解释这一现象的同时调试您的程序。
关于eclipse - Eclipse : Logic, 中的 V8 调试器或有史以来最奇怪的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12159854/