Защо Hello World за V8 причинява грешка в сегментирането на Ubuntu?

Компилирах V8 на Ubuntu 14.04 и сега се опитвам да взема примера hello_world.cc работи, но когато го изпълня, получавам Segmentation fault (core dumped).

Ето моя източник за hello_world.cc:

#include <v8.h>

using namespace v8;

int main(int argc, char* argv[]) {
  // Get the default Isolate created at startup.
  Isolate* isolate = Isolate::GetCurrent();

  // Create a stack-allocated handle scope.
  HandleScope handle_scope(isolate);

  return 0;
}

Следвайки инструкциите, ето командата, която използвах за изграждане на hello_world.cc в изпълним файл:

g++ -Iinclude -g hello_world.cc -o hello_world -Wl,--start-group out/x64.debug/obj.target/{tools/gyp/libv8_{base,snapshot},third_party/icu/libicu{uc,i18n,data}}.a -Wl,--end-group -lrt -lpthread

Обърнете внимание, че в допълнение към инструкциите трябваше да добавя флаг -lpthread, за да го накарам да компилира и -g, за да включа символите за отстраняване на грешки.

Ето изхода от програмата:

$ ./hello_world
Segmentation fault (core dumped)

И ако стартирам gdb hello_world core, получавам:

[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./hello_world'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00000000004148bb in v8::HandleScope::Initialize (this=0x7fff9b86a110, isolate=0x0) at ../src/api.cc:572
572   prev_next_ = current->next;

Ред 572 от src/api.cc е тук


person donturner    schedule 23.05.2014    source източник
comment
Опитахте ли да изпълните целия пример, а не само първото тримесечие?   -  person Shoe    schedule 23.05.2014
comment
Да, сегфаултира на същия ред. Премахнах всичко след него, за да избегна публикуването на код, който не е свързан с проблема.   -  person donturner    schedule 23.05.2014
comment
проследяването на gdb ви казва какво не е наред, isolate е нулев указател, така че current вероятно също ще бъде адрес за боклук, погледнете в Isolate::GetCurrent, за да видите защо получавате нулев указател   -  person Radu Chivu    schedule 23.05.2014
comment
Благодаря, това определено е причината, въпреки че решение все още не ми се изплъзва. Зададох нов въпрос относно това тук: stackoverflow.com/questions/23825034/   -  person donturner    schedule 23.05.2014
comment
Сблъсках се с този проблем по-рано днес, когато използвах моментна снимка snapshot_blob.bin от предишна инсталация v8, възможно е моментната снимка да е повредена или друг по-малко очевиден проблем, но това е улика за всеки друг, който се сблъсква с този проблем.   -  person wizebin    schedule 31.12.2017


Отговори (1)


Добавяне на чек за Isolate* isolate = Isolate::GetCurrent(); връщане на NULL:

Isolate* isolate = Isolate::GetCurrent();
if(!isolate) {
    isolate = v8::Isolate::New();
    isolate->Enter();
}
person donturner    schedule 23.05.2014