node-inspectorを使用して、V8 で実行されている JavaScript スクリプトをデバッグしようとしています。アプリ側では、私はちょうどやった
v8::Debug::EnableAgent("MyApp", 5858);
Node-inspector は正常に接続し、一時停止/一時停止解除してコードを表示することさえできます。ただし、段階的な実行は機能せず、ブレークポイントも、おそらく他の多くのことも機能しません。そのようなことをしようとすると、Node-inspector から次のエラーが表示されます。
Node Inspector v0.7.0
Visit http://127.0.0.1:8080/debug?port=5858 to start debugging.
Received request for a method not implemented: Debugger.setSkipAllPauses
Received request for a method not implemented: Debugger.setSkipAllPauses
Received request for a method not implemented: Debugger.setSkipAllPauses
Received request for a method not implemented: Debugger.setBreakpoint
Received request for a method not implemented: Debugger.setBreakpoint
Received request for a method not implemented: Debugger.setBreakpoint
だから私は何かが欠けていると思います。
私がやろうとしていることがサポートされているかどうかはわかりません.node-inspectorはNode.js用であり、任意のV8用ではないと思います. もしそうなら、それを機能させるために何が必要でしょうか?
特に Miroslav の助けに感謝します。を実行するDEBUG=node-inspector:protocol:* node-inspector
には、もう少し進みました。ステップごとの実行が機能するようになり、ブレークポイントはほとんどの場合に機能します (間違ったソース ファイルを選択した場合を除く - 以下を参照)。
次のようなグローバルprocess
オブジェクトを提供しました。
// process object: http://nodejs.org/api/process.html#process_process
process.stdout = ...
process.stderr = ...
process._baseDir = ...
process.mainModule = {filename: process._baseDir + "/main.js"}
process.argv = ["myapp.exe", process.mainModule.filename]
process.cwd = function() { return process._baseDir; }
Internal error: TypeError: Cannot read property 'line' of null
これで、コンソールにエラーが表示されます。node-inspector で、私はこれを取得します:
Wed, 19 Mar 2014 11:58:43 GMT node-inspector:protocol:v8-debug request: {"seq":170,"type":"request","command":"backtrace","arguments":{"inlineRefs":true,"fromFrame":0,"toFrame":50,"maxStringLength":10000}}
Wed, 19 Mar 2014 11:58:43 GMT node-inspector:protocol:devtools frontend: {"method":"Debugger.setOverlayMessage","id":48}
Wed, 19 Mar 2014 11:58:43 GMT node-inspector:protocol:devtools backend: {"id":48}
Wed, 19 Mar 2014 11:58:43 GMT node-inspector:protocol:v8-debug response: {"seq":41,"request_seq":170,"type":"response","success":false,"message":"Internal error: TypeError: Cannot read property 'line' of null"}
もう 1 つの問題は、スクリプト ファイルが常に正しいとは限らないことです。C++ 側では、次のようにロードしています。
ReturnType execJsFile(const std::string& jsSourceDir, const std::string& extfilename) {
v8::TryCatch try_catch;
std::string fullfilename = jsSourceDir + "/" + extfilename;
std::string sourceStr;
CHECK_RETURN(readFile(fullfilename, sourceStr));
// The origin is for the debugger, e.g. node-inspector. It expects an URL.
Local<String> origin = jsStr("file:///" + fullfilename);
Local<String> source = jsStr(sourceStr);
Local<v8::Script> script = Script::Compile(source, origin);
if(script.IsEmpty()) {
assert(try_catch.HasCaught());
return "JS compile failed: " + jsReportExceptionToString(Isolate::GetCurrent(), &try_catch);;
}
Local<Value> result = script->Run();
if(result.IsEmpty()) {
assert(try_catch.HasCaught());
return "JS script execution failed: " + jsReportExceptionToString(Isolate::GetCurrent(), &try_catch);
}
return true;
}
これにより、ドメインの下にあるすべてのファイルfile://
がソース リストに表示されます。ただし、main.js
の下に追加のエントリを取得し(no domain)
ます。私が変更を加えるとき
process.mainModule = {filename: "file:///" + process._baseDir + "/main.js"}
それは消えますが、ドキュメントによると、それは私が期待していた方法ではありません。
main.js で実行を一時停止/中断すると、さらに別のソースに表示され[VM] main.js
、黄色がかった背景になります。
また、ソース内のすべてのファイルは、ソースの最初の行に追加されたプレフィックスをfile://
取得します。(function (exports, require, module, __filename, __dirname) {
その行は私のコードではなく、node-inspector からのものです。なぜここにそれを追加するのですか?それは特にです。私のコードはわずかに異なるプレフィックスを追加するため、奇妙です( function(module, exports) {
。