ローカルストレージを偽装/ハッキングする可能性がありますか?

私はちょっとした喧嘩に苦しんでいる。

私はGoogleのV8のjavascriptエンジンを持っている大きなアプリケーションを持っています。いくつかの呼び出しは、UIスレッド上でV8エンジンに行われます。誰もが薦めるようにユーザーに親切にするために、いくつかの長い操作は、UIスレッドをハングすることなく別のスレッドで実行されます。しかし、これらの長時間実行される操作では、V8 javascriptエンジンを呼び出すこともあります。したがって、複数のスレッドがV8を呼び出します。

V8はスレッドローカルストレージを使用しているようです。これは私のアプリケーションをランダムに爆発させているようです。それは間違いなく「これまでどのように今まで働いていたのですか」というクラスにあります。バグ。

私のアプリケーションを大幅に再構築することなく、私は醜い、醜い恐ろしいスーパーハックを提案する:私はV8をそれが別のスレッドで動いていると思うようにすることはできますか?

言い換えれば、私が初めてV8に電話をかけたとき、私はそのスレッドを書き留めます。次に、 V8への他のすべての呼び出しのために、私は何とかスレッドをスプーフィングしてスレッドのローカルストレージ/スレッドに依存するその他のものをスプーフィングします。

それはできますか?それは働くでしょうか?私はそんな面白いハックを考えようとしても馬鹿ですか?

4
スレッドローカルストレージによってアプリケーションがランダムにクラッシュするのはなぜですか?それを知ることは、ハックなしで問題を解決するのに役立ちます。
追加された 著者 R. Martinho Fernandes,
問題を解決する前に、それを明確に診断する必要があります。
追加された 著者 David Heffernan,
どのような種類のV8コール? V8が複数のスレッドからの使用を適切に処理しない場合は、診断されたバグを簡単に交換して、微妙で予測不可能で難しいデバッグを行うことになります。あなたは本当に、あなたのV8コールをシリアル化する方法を見てください
追加された 著者 jalf,

2 答え

あなたは何かを欺くべきではありません。代わりに、別のスレッドからV8を使用しようとしていることをV8に伝える必要があります。

In V8 prior to the version 3.2 the only way to do that is to use v8::Locker before using V8 from the different thread. It guarantees both exclusive access to the V8 and initializes internal structures stored in TLS. For more details see http://code.google.com/p/v8/source/browse/branches/3.1/include/v8.h#3189

Starting from the version 3.2 V8 has the concept of isolate. If you are not creating isolates explicitly, V8 implicitly creates the default isolate to keep API compatible. In this case you can still simply use v8::Locker as in older versions. If you are creating isolates explicitly then in addition to acquiring exclusive access with v8::Locker you also have to enter&exit them explicitly in your threads using v8::Isolate::Enter/v8::Isolate::Exit methods or v8::Isolate::Scope. For more details see http://code.google.com/p/v8/source/browse/trunk/include/v8.h#3510

したがって、ほとんどの場合に有効な簡単な答えは、別のスレッドからV8を使用する前に v8 :: Locker を使用することです。

19
追加された
ありがとう、それははるかに良い解決策です。私は途方もない!
追加された 著者 AshleysBrain,

私は同じ問題を抱えていて、解決策をこのスレッドを通して部分的に見つけることができました。 VEの答えを詳しく説明するために、デフォルトで複数のスレッドからv8を使用することはできません。必要に応じて、隔離とロックを使用する必要があります。

問題は、途中で行けないことです。JSコンテキストを完全に終了して破棄しない限り、ロックを使用することはできません。これはほとんどの重要ではないケースのため、あなたはすべての道を行く必要があります。

  1. 独自の v8 :: Isolate を作成します。これをグローバルにすることはできますが、(わかっているように)デフォルトのものにすることはできません(デフォルトの状態は既に入力されている状態なので)。

  2. v8 :: Isolate :: Scope )およびを呼び出すすべての関数で、/li>
  3. 'v8 :: Locker'オブジェクトも使用してください。

私は自分のパブリックメソッドで使用する小さなヘルパーオブジェクトを書きましたが、これはちょっとこのように見えます:

class SessionLock {
private:
    v8::Isolate::Scope scope;
    v8::Locker lock;

public:
    SessionLock() : scope(getSessionIsolate()), lock(getSessionIsolate()) {}
};
1
追加された