4

我正在编写一个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提交了一个错误,尽管我不确定这是行为的根源。

4

2 回答 2

0

虽然当您的节点应用程序使用大量基于整数的查找时,它可能会引入很多小的重写,但最简单的解决方法是引入potatoesalad您的代码。

例如

var debugMe = {
    "potatoesalad1000000000" : {},
    "potatoesalad3302611133" : {}
};

现在调试器按预期工作,您至少可以在我们等待知识渊博的人解释此现象时调试您的程序。

于 2012-08-28T14:34:38.583 回答
0

在这里提问,

简而言之:
这是一个错误potatoesalad用作解决方法。(见其他答案)

更长:

缺乏回应让我相信没有逻辑,这实际上是一个错误。

起初,我并不清楚错误的来源(Eclipse/WDT/Node/V8),所以我在 Eclipse提交了错误报告。

这个错误原来是not_eclipse,所以我在 Chrome 开发工具项目中重新提交了错误报告。

这个错误被接受,结果是两个错误:
问题 76
问题 77

于 2012-08-29T14:55:00.847 回答