4

文字列を整数に変換したものをキーとして使用してオブジェクトにデータを入力するNode.jsアプリケーションを作成しています (「62616324573」など)。オブジェクトは常にキー{key:}を文字列として格納します。これは、javascript配列とその[インデックス]の動作に比べて理想的です。

配列は、undefined定義されたインデックス間のすべてのインデックスに対して 1 回、100 万回定義されます。

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 times を記憶するためundefinedです。arrayobject

  • 一部の数値がキー (文字列) として取得され、他の数値がインデックスとして取得されるのはなぜですか?
  • インデックスの組み合わせによってデバッガで機能するものと機能しないものがあるのはなぜですか?
  • オブジェクトでも起こっていることを知らずに、「百万回未定義」の問題はありますか?

要約してみましょう:

  • 文字列キャスト整数 'int' の小さな違いは正常に動作しているように見えますが、デバッガーでは [インデックス] になります。
  • キーの最大約 10 億の大きな違いは機能せず、Variablesウィンドウがクラッシュします。コンソール出力なし。
  • さらに大きな違いは再び機能しますが、[index] になるものもあれば、'key' のままになるものもあります。

手動でクラッシュ テストを行う必要があったため、問題がオブジェクト自体の内容ではなく、数値にあることが判明するまでに、長い時間がかかりました。同じ (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 にバグレポートを提出しました。

バグは であることが判明したため、Chrome Dev Tools プロジェクトでバグレポートnot_eclipse再提出しました。


このバグは受け入れられ、問題 76
問題 77の2 つのバグであることが判明しました。

于 2012-08-29T14:55:00.847 に答える