2

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) {

4

2 に答える 2

1

メッセージを実行DEBUG=node-inspector:protocol:* node-inspectorして調べると、詳細情報が見つかる場合があります。0.1.9 などの古いバージョンを使用することもできます。これは、ノード固有のものへの依存度が低い可能性があります。

Node Inspector コードの 95% は V8 プロトコルのみを使用していると言えます。の使用法DebuggerClient.prototype.evaluateGlobalを探して、ノード固有の機能が使用されている場所を見つけます。

最初に変更するのはgetResourceTreeですlib/PageAgent.js。すべてのソース ファイル (まだロードされていないものを含む) を一覧表示する独自の方法を実装するか、空のツリーを返します。

アップデート

最初に Node の CLI デバッガーを試してください。

$ node debug localhost:5858

私の知る限り、CLI デバッガーは V8 デバッガー プロトコル機能のみを使用し、ノード固有のものは使用しません。CLI を使用して V8 アプリをデバッグできる場合、他の問題は V8 アプリではなく Node Inspector にあることがわかります。

于 2014-03-04T18:28:52.623 に答える