Почему 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
Да, это segfaults в той же строке. Я удалил все после него, чтобы не публиковать код, который не имел отношения к проблеме.   -  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