Libv8: программа C++ иногда дает сбой при запуске JS-кода в обработчике SIGINT (после Ctrl+C)C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Libv8: программа C++ иногда дает сбой при запуске JS-кода в обработчике SIGINT (после Ctrl+C)

Сообщение Anonymous »

У меня есть программа на C++, которая работает в терминале и использует libv8. Я хотел поймать Ctrl+C и выполнить несколько проверок и очисток перед выходом. Чтобы перехватить Ctrl+C, я использую сигнал (SIGINT, intHandler), он работает, но иногда дает сбой. Вот минимальная демо-версия (просто удерживайте Ctrl+C, и примерно после 100 попыток произойдет сбой, более сложные программы выдают сбой чаще, это простая демонстрация, поэтому сбой происходит реже, но все равно происходит сбой).
#include
#include
#include
#include

const char* ToCString(const v8::String::Utf8Value& value) {//, char * place
return *value ? *value : "";
}

void echo(const v8::FunctionCallbackInfo < v8::Value > &args) {
// Print first argument
v8::HandleScope handle_scope(args.GetIsolate());
v8::String::Utf8Value str(args.GetIsolate(), args[0]);
const char *cstr = ToCString(str);
printf("%s\n", cstr);
fflush(stdout);
};

v8::Isolate* globalIsolate;
v8::Local globalContext;

void intHandler(int dummy) {
// compile script
v8::TryCatch try_catch(globalIsolate);
v8::Local source = v8::String::NewFromUtf8(globalIsolate, "echo('ctrl+c was pressed')");
v8::Local script;
if (!v8::Script::Compile(globalContext, source).ToLocal(&script)) {
fprintf(stderr, "error 1: compiled failed!\n");
}
// Run the script to get the result.
v8::Local result;
if (!script->Run(globalContext).ToLocal(&result)) {
fprintf(stderr, "error 2: run failed!\n");
}
}

int main(int argc, char* argv[]) {
signal(SIGINT, intHandler);
// Initialize V8
v8::V8::InitializeICUDefaultLocation(argv[0]);
v8::V8::InitializeExternalStartupData(argv[0]);
std::unique_ptr platform = v8::platform::NewDefaultPlatform();
v8::V8::InitializePlatform(platform.get());
v8::V8::Initialize();
v8::Isolate::CreateParams create_params;
create_params.array_buffer_allocator = v8::ArrayBuffer::Allocator::NewDefaultAllocator();
v8::Isolate* isolate = v8::Isolate::New(create_params);
v8::Isolate::Scope isolate_scope(isolate);
globalIsolate = isolate;
v8::HandleScope handle_scope(isolate);
v8::Local global = v8::ObjectTemplate::New(isolate);
global->Set(isolate, "echo", v8::FunctionTemplate::New(isolate, echo));
v8::Local context = v8::Context::New(isolate, NULL, global);
v8::Context::Scope context_scope(context);
globalContext = context;
// compile script
v8::TryCatch try_catch(isolate);
v8::Local source = v8::String::NewFromUtf8(isolate, "var x = 1; while (true) { x++; if (x % 10000000 === 0) echo(x); };");
v8::Local script;
if (!v8::Script::Compile(context, source).ToLocal(&script)) {
fprintf(stderr, "error 3: compiled failed!\n");
return 1;
}
// Run the script to get the result.
v8::Local result;
if (!script->Run(context).ToLocal(&result)) {
fprintf(stderr, "error 4: run failed!\n");
return 2;
}
// Dispose the isolate and tear down V8.
//isolate->Dispose();
//v8::V8::Dispose();
//v8::V8::DisposePlatform();
//delete create_params.array_buffer_allocator;
printf("Program finished\n");
return 0;
}

Я компилирую с помощью:
g++ -o demo demo.cpp -lv8 -lpthread -lssl -lcrypto -Wall -ggdb -I/usr/include/v8

Запустите программу и продолжайте нажимать ctrl+c, пока не произойдет сбой.
Я предполагаю, что мне нужно запускать JS-код по-другому, когда я нахожусь внутри этого сигнала. обработчик, но я не знаю как. Спасибо.
Примечания:
  • Я использую Ubuntu 22.04.4
  • libv8/libnode 7.8.279.23-node.56
  • g++ 11.4 .0
  • Я не знаю, как выполнить трассировку стека GDB, потому что, если я использую GDB, это мешает ctrl+c
  • Я использовал -fsanitize=address,unопределенный и получил трассировку стека, которая указывает где-то глубоко внутри v8:
    =================================================================
    ==403170==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000027 (pc 0x73d794d71461 bp 0x7ffee62e53f0 sp 0x7ffee62e5200 T0)
    ==403170==The signal is caused by a READ memory access.
    ==403170==Hint: address points to the zero page.
    #0 0x73d794d71461 in v8::internal::Compiler::GetSharedFunctionInfoForScript(v8::internal::Isolate*, v8::internal::Handle, v8::internal::Compiler::ScriptDetails const&, v8::ScriptOriginOptions, v8::Extension*, v8::internal::ScriptData*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason, v8::internal::NativesFlag) (/lib/x86_64-linux-gnu/libnode.so.72+0xd71461)
    #1 0x73d794cc8ccf in v8::ScriptCompiler::CompileUnboundInternal(v8::Isolate*, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason) (/lib/x86_64-linux-gnu/libnode.so.72+0xcc8ccf)
    #2 0x73d794cc91ad in v8::ScriptCompiler::Compile(v8::Local, v8::ScriptCompiler::Source*, v8::ScriptCompiler::CompileOptions, v8::ScriptCompiler::NoCacheReason) (/lib/x86_64-linux-gnu/libnode.so.72+0xcc91ad)
    #3 0x73d794cc9260 in v8::Script::Compile(v8::Local, v8::Local, v8::ScriptOrigin*) (/lib/x86_64-linux-gnu/libnode.so.72+0xcc9260)
    #4 0x5eaac0640466 in intHandler(int) /home/me/demo.cpp:27
    #5 0x73d792a4251f (/lib/x86_64-linux-gnu/libc.so.6+0x4251f)
    #6 0x17913f4c31c0 ()
however demo.cpp:27 is this line inside the intHandler:

if (!v8::Script::Compile(globalContext, source).ToLocal(&script)) {



Подробнее здесь: https://stackoverflow.com/questions/781 ... -handler-a
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»