我正在编写一个 Node.js 应用程序,其中我使用字符串翻转整数作为键填充对象数据(例如" 62616324573&#34 )。对象始终将键 {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
,这个问题应该仅在{{1}时存在而不是使用JSON array
。
让我回顾一下:
object
窗口崩溃导致高达10亿左右的巨大差异。无控制台输出。 因为我必须进行手动崩溃测试,所以我永远需要找出数字中存在的问题,而不是对象本身的内容。很难想象问题只影响调试器而不影响应用程序本身,因为它是相同的(V8)引擎。我希望有人可以指出我遗漏的所有事实和变数。
-update -
似乎没有人知道这一点。不为人知的逻辑,也不是已知的错误。我在Eclipse WDT上filed a bug,虽然我不确定这是行为的来源。
答案 0 :(得分:0)
虽然当您的节点应用程序使用大量基于整数的查找时,它可能会引入很多小的重写,但最简单的解决方法是将potatoesalad
引入您的代码。
e.g。
var debugMe = {
"potatoesalad1000000000" : {},
"potatoesalad3302611133" : {}
};
现在调试器按预期工作,你至少可以调试你的程序,而我们正在等待知识渊博的人来解释这种现象。
答案 1 :(得分:0)
Asker,
短:
这是一个错误。使用potatoesalad
作为解决方法。 (见其他答案)
更长:
缺乏回应让我相信没有逻辑,这实际上是一个错误。
起初,我不清楚bug的来源(Eclipse / WDT / Node / V8),所以我提交了bugreport at Eclipse。
该错误原来是not_eclipse
,因此我在Chrome开发工具项目中re-filed the bugreport。