如何使Chrome开发工具显示JavaScript源

时间:2019-04-11 09:48:25

标签: c++ v8 embedded-v8

我稍微修改了hello-world.cc示例,从d8导入了一些代码。然后,使用websocketppasio,将WebSocket服务器添加到程序中。 另外,我使用V8 inspector from an embedder standpoint为检查器协议后端添加了一个简单的实现。

现在,当我启动程序并使用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"}

为此发送通知和响应:

{"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选项卡为空(因此,我无法尝试设置断点)。

我在V8中注入JS的代码:

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;

}

我认为我做错了,因为我应该能够在CDT中看到内容为func_add.js的{​​{1}}

1 个答案:

答案 0 :(得分:1)

根本不检查源代码,我记得在这个确切的用例上遇到了一些困难时期。

尝试将协议添加到您的源参数中。 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。

协议实现如我在您引用的文章中所述。 希望这会有所帮助。

在您的代码中,看不到您在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"}}

虽然实现非常简单,但是有很多原因导致您的代码根本无法显示。 希望有帮助。