Eclipse中的V8调试器:逻辑,还是最奇怪的错误?

时间:2012-08-28 13:02:23

标签: eclipse node.js v8 javascript-debugger

我正在编写一个 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

  • 为什么有些数字被视为键(字符串)而其他数字被视为索引?
  • 为什么某些索引组合在调试器中起作用,而其他索引则不合适?
  • "百万次未定义"没有我知道的问题也发生在对象上?

让我回顾一下:

  • 字符串转换整数的小差异' int'似乎工作正常,但在调试器中它们变成[indices]
  • 关键的不工作,object窗口崩溃导致高达10亿左右的巨大差异。无控制台输出。
  • 更大的差异再次起作用,但有些变得[索引]而其他人则保持关键'。

因为我必须进行手动崩溃测试,所以我永远需要找出数字中存在的问题,而不是对象本身的内容。很难想象问题只影响调试器而不影响应用程序本身,因为它是相同的(V8)引擎。我希望有人可以指出我遗漏的所有事实和变数。

-update -

似乎没有人知道这一点。不为人知的逻辑,也不是已知的错误。我在Eclipse WDT上filed a bug,虽然我不确定这是行为的来源。

2 个答案:

答案 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

这个错误被接受,结果证明是两个错误:
Issue 76
Issue 77