2016-08-17 5 views
2

linuxでGoogle V8を使用しているときに問題があります。共有ライブラリにV8インスタンスを作成すると、segfaultが生成されます。同じコードは、WindowsのDLLとLinuxの実行可能ファイルで正常に動作します。google v8 NewがLinux共有ライブラリで失敗しました "セグメントエラー"が発生しました

マイコード:

extern "C" void InitV8ExtensionInterFace(){ 
    v8::V8::InitializeICU(); 
    v8::V8::Initialize(); 
    v8::Isolate* isolate = v8::Isolate::New(); **//error occur** 
    threadfunc(argc, args); 
} 

gdbスタックトレース:

#0 0x0000000000000000 in ??() 
#1 0x00007ffff3cb86d5 in v8::internal::Builtins::SetUp (this=0x7fffffffb9e0, isolate=0x235abb0, create_heap_objects=false) at ../src/builtins.cc:1567 
#2 0x00007ffff3e271cf in v8::internal::Isolate::Init (this=0x235abb0, des=0x0) at ../src/isolate.cc:2115 
#3 0x00007ffff3c96049 in v8::Isolate::New (params=...) at ../src/api.cc:6861 
#4 0x00007ffff3b78d40 in InitV8ExtensionInterFace() at ../Framework/ExPublic.cpp:107 
#5 0x00000000004729db in myTest1() at arangod/RestServer/arangod.cpp:106 
#6 0x0000000000472a50 in main (argc=1, argv=0x7fffffffe118) at arangod/RestServer/arangod.cpp:126 

V8機能void Builtins::SetUp(Isolate* isolate, bool create_heap_objects)に、配列functionsが空であることが表示されます。

extern "C" void InitV8ExtensionInterFace(){ 
    v8::V8::InitializeICU(); 
    v8::Platform* platform = v8::platform::CreateDefaultPlatform(); 
    v8::V8::InitializePlatform(platform); **//error occur** 
    v8::V8::Initialize(); 
    v8::Isolate* isolate = v8::Isolate::New(); 
    threadfunc(argc, args); 
} 

gdbスタックトレース:私はv8::Platformを初期化する場合は、エラーコードV8::InitializePlatform(platform)に発生します

1: V8_Fatal 
2: v8::internal::V8::InitializePlatform(v8::Platform*) 
3: InitV8ExtensionInterFace 
4: 0x4aab60 
5: 0x4aacf1 
6: 0x5f4532 
7: 0x47c32b 
8: 0x474498 
9: 0x472ae1 
10: __libc_start_main 
11: 0x4726f9 

Thread 1 received signal SIGABRT, Aborted. 
0x00007ffff66595e5 in raise() from /lib64/libc.so.6 
(gdb) where 
#0 0x00007ffff66595e5 in raise() from /lib64/libc.so.6 
#1 0x00007ffff665adc5 in abort() from /lib64/libc.so.6 
#2 0x00007fffc6e7d9c9 in v8::base::OS::Abort() at ../src/base/platform/platform-posix.cc:233 
#3 0x00007fffc6e7b586 in V8_Fatal (file=0x7fffc703f535 "../src/v8.cc", line=107, format=0x7fffc6ffe77a "Check failed: %s.") at ../src/base/logging.cc:116 
#4 0x00007fffc6cbd909 in v8::internal::V8::InitializePlatform (platform=0x267d840) at ../src/v8.cc:107 
#5 0x00007fffc690bc8b in InitV8ExtensionInterFace() at ../Framework/ExPublic.cpp:98 
#6 0x00000000004aab60 in myTest() at arangod/V8Server/ApplicationV8.cpp:1068 
#7 0x00000000004aacf1 in triagens::arango::ApplicationV8::prepare2 (this=0x2378310) at arangod/V8Server/ApplicationV8.cpp:1093 
#8 0x00000000005f4532 in triagens::rest::ApplicationServer::prepare2 (this=0x2377000) at arangod/ApplicationServer/ApplicationServer.cpp:525 
#9 0x000000000047c32b in triagens::arango::ArangoServer::startupServer (this=0x2375330) at arangod/RestServer/ArangoServer.cpp:1009 
#10 0x0000000000474498 in triagens::rest::AnyServer::start (this=0x2375330) at arangod/Rest/AnyServer.cpp:347 
#11 0x0000000000472ae1 in main (argc=1, argv=0x7fffffffe118) at arangod/RestServer/arangod.cpp:139 

私はv8::V8::GetVersionと、実行時に "4.3.61" を取得します。

この問題は数日間困っています。誰かが私に助けてくれれば幸いです。ありがとうございます。

+0

プラットフォームを初期化しない場合、エラーは関数 'v8 :: Isolate :: New'で発生します。 GDB情報:#0 0x0000000000000000? ../src/builtins.cc:1567#2でv8 :: internal :: Builtins :: SetUp(this = 0x7fffffffb9e0、isolate = 0x235abb0、create_heap_objects = false)の#1 0x00007ffff3cb86d5をv8 :: internal ::#で0x00007ffff3e271cfに変換します。 ../src/isolate.cc:2115#3のIsolate :: Init(this = 0x235abb0、des = 0x0)v8 :: Isolate :: New(params = ...)in ../src/apiの0x00007ffff3c96049。 ../Framework/ExPublic.cpp:107のinitV8ExtensionInterFace()内のcc:6861#4 0x00007ffff3b78d40 arangod/RestのmyTest1()の0x00000000004729db –

+0

実行時の@isanaeバージョンは、関数 'v8を介して" 4.3.61 " :V8 :: GetVersion' –

答えて

0

V8::InitializeExternalStartupData()への電話がありません。Get Startedチュートリアルをご覧ください。

int main(int argc, char* argv[]) 
{ 
    // Initialize V8. 
    V8::InitializeICU(); 
    V8::InitializeExternalStartupData(argv[0]); 
    Platform* platform = platform::CreateDefaultPlatform(); 
    V8::InitializePlatform(platform); 
    V8::Initialize(); 

    // ... 
} 

あなたが実行可能と並んnatives_blob.binsnapshot_blob.binをコピーする必要があります。それらはV8バイナリのどこかにあるはずです。


より良いスタックトレースを使用して編集を確認すると、2つの非常に異なる問題が発生しています。最初のクラッシュ(空のfunctions配列)は、CreateDefaultPlatform()を呼び出さないためです。これは必須です。

二クラッシュは、この行にInitializePlatform()内側にある:

void V8::InitializePlatform(v8::Platform* platform) { 
    CHECK(!platform_);  // <- here 
    CHECK(platform); 
    platform_ = platform; 
} 

このチェックは、デフォルトのプラットフォームは一度だけ作成されていることを確認することです。 InitializePlatform()を2回呼び出しているようです。あなたはそれがどこから呼び出されるのか把握するためにブレークポイントを入れてみることができます。

+0

こんにちは、私は自分でv8をビルドしました。そしてv8はArangodbになりました。バージョンは "4.3.61"です。そして、 "v8 :: InitializeExternalStartupData"という名前の関数はありません。 –

+0

@ cai.liより良いバックトレースを得るためにgdbのインストールを修正できますか? 4.3歳以上ですが、私は何かを把握しようとする、希望を失うことはありません。 – isanae

+0

@ cai.li私は古いコードを掘り下げました.2番目のスニペットで 'CreateDefaultPlatform()'と同じことをしています。あなたは '.so'と同じバージョンに対してコンパイルしていますか?あなたは 'v8 :: internal :: Version'をチェックし、実行時に正しいバージョンを取得できることを確認できますか? – isanae

関連する問題