Как заставить Chrome Dev Tools показывать источник JavaScript - PullRequest
0 голосов
/ 11 апреля 2019

Я немного изменил образец hello-world.cc, импортировав некоторый код из d8.Затем, используя websocketpp и asio , я добавил в программу сервер WebSocket.Кроме того, я использовал V8 инспектор с точки зрения устройства для внедрения , чтобы добавить простую реализацию для протокола инспектора.

Теперь, когда я запускаю свою программу и затем использую Chrome, чтобы перейти к chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9002, я получаю следующие сообщения от CDT:

{"id":1,"method":"Profiler.enable"}

для ведьмы ответ:

{"id":1,"result":{}} 

затем

{"id":2,"method":"Runtime.enable"}

для этого aуведомление и ответ отправляются:

{"method":"Runtime.executionContextCreated",
 "params":{"context":{"id":1,"origin":"","name":"MyApplication"}}}

{"id":2,"result":{}}

, затем:

{"id":3,"method":"Debugger.enable"}

, уведомление и ответ отправляются обратно клиенту:

{"method":"Debugger.scriptParsed",
 "params":{
  "scriptId":"4","url":"func_add.js","startLine":0,
  "startColumn":0,"endLine":0,"endColumn":35,
  "executionContextId":1,"hash":"365568ee6245be1376631dbf20e7de9d42c9adf1",
  "isLiveEdit":false,"sourceMapURL":"","hasSourceURL":false,
  "isModule":false,"length":35
  }
}

{"id":3,"result":{"debuggerId":"(DC239109305DBEF825A955524584A826)"}}

На данный момент я не буду добавлять к вопросу другие сообщения, полученные от внешнего интерфейса, и отправленные ответы.Последний обмен:

    {"id":7,"method":"Runtime.runIfWaitingForDebugger"}
    {"id":7,"result":{}}     

Моя проблема: в CDT вкладка Sources пуста (и поэтому я не могу попытаться установить точку останова).

Мой кодвнедрить JS в V8:

const char * pszScript = "function add( a, b) { return a+b; }";
v8::Local<v8::String> source =
  v8::String::NewFromUtf8(isolate, pszScript, v8::NewStringType::kNormal).ToLocalChecked();
v8::Local<v8::String> name =
  v8::String::NewFromUtf8(isolate, "func_add.js", v8::NewStringType::kNormal).ToLocalChecked();
ExecuteString( isolate, source, name );

Моя ExecuteString функция:

bool ExecuteString(v8::Isolate* isolate, v8::Local<v8::String> source,
                   v8::Local<v8::Value> name) {

  v8::HandleScope handle_scope(isolate);
  v8::Local<v8::Context> context = isolate->GetCurrentContext();
  v8::Context::Scope context_scope(context);
  v8::TryCatch try_catch(isolate);
  try_catch.SetVerbose(true);

  v8::MaybeLocal<v8::Value> maybe_result;
  bool success = true;
  v8::ScriptOrigin origin(name);

  v8::ScriptCompiler::Source script_source(source, origin);
  v8::MaybeLocal<v8::Script> maybe_script;
  maybe_script = v8::ScriptCompiler::Compile(context, &script_source);

  v8::Local<v8::Script> script;
  if (!maybe_script.ToLocal(&script)) {
    // Print errors that happened during compilation.
    ReportException(isolate, &try_catch);
    return false;
  }

  maybe_result = script->Run(context);

  v8::Local<v8::Value> result;
  if (!maybe_result.ToLocal(&result)) {

    // Print errors that happened during execution.
    ReportException(isolate, &try_catch);
    return false;
  }

  if (!result->IsUndefined()) {
    // If all went well and the result wasn't undefined then print
    // the returned value.
    v8::String::Utf8Value str(isolate, result);
    fwrite(*str, sizeof(**str), str.length(), stdout);
    printf("\n");
  } else {
    printf("undefined\n");
  }
  return success;

}

Я думаю, что я делаю что-то не так, так как я должен иметь возможность видеть какой-то func_add.js источникв CDT с содержанием function add( a, b) { return a+b; }

1 Ответ

1 голос
/ 12 апреля 2019

Если вообще не проверять исходный код, я помню, что в этом конкретном случае у меня были плохие времена.

попробуйте добавить к вашему исходному параметру протокол. CDT нужен любой файл протокола, http, https для создания дерева исходников. Он также будет использовать этот URI для запроса карт или любой другой вещи, связанной с исходным кодом.

v8::Local<v8::String> name =
  v8::String::NewFromUtf8(isolate, "file://func_add.js", v8::NewStringType::kNormal).ToLocalChecked();
ExecuteString( isolate, source, name );

Время от времени также случается, что в зависимости от реализации v8 официальный chrome не может отображать исходный код, отладку и т. Д. Попробуйте использовать Chrome Canary, если это так.

Реализация протокола такая, как я описал в вашем ссылочном посте. Надеюсь, это поможет.

В вашем коде я не вижу, где вы обнаруживаете свой Context для объекта Inspector, но что-то подобное должно произойти где-то в вашем коде:

inspector_->contextCreated(
            v8_inspector::V8ContextInfo(context, 1, v8_inspector::StringView(
                    reinterpret_cast<const uint8_t *>("ABCD"), 4)));

Я делаю это сразу после создания контекста и установки его глобального объекта.

CDT запросит содержимое скрипта с сообщением вида:

{"id":8,"method":"Debugger.getScriptSource","params":{"scriptId":"7"}}

Хотя реализация очень проста, существует множество причин, по которым ваш код просто не будет отображаться. Надеюсь, это поможет.

...