我正在尝试使用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"}
另一件事是脚本文件并不总是正确的。在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"}
然而,它消失了,这不是我所期望的那样“{3}}。
当我在main.js中暂停/中断执行时,它会显示在另一个源[VM] main.js
中并获得黄色背景。
此外,file://
下的源中的所有文件都会在源的第一行添加(function (exports, require, module, __filename, __dirname) {
前缀。该行不是来自我的代码,而是来自node-inspector。为什么在这里添加?特别是。很奇怪,因为我的代码添加了稍微不同的前缀( function(module, exports) {
。
答案 0 :(得分:1)
运行DEBUG=node-inspector:protocol:* node-inspector
并检查消息,您可以在那里找到更多信息。您也可以尝试使用旧版本,例如0.1.9,它可能对特定于节点的东西的依赖性较小。
我会说95%的Node Inspector代码仅使用V8协议。查找DebuggerClient.prototype.evaluateGlobal
的用法以查找使用特定于节点的功能的位置。
要改变的第一件事是getResourceTree
lib/PageAgent.js
。要么实现自己的列出所有源文件的方式(包括尚未加载的文件),要么返回空树。
<强>更新强>
首先尝试Node的CLI调试器:
$ node debug localhost:5858
据我所知,CLI调试器仅使用V8调试器协议功能,没有特定于Node的功能。当您能够使用CLI调试V8应用程序时,您将知道任何其他问题都在Node Inspector中,而不在V8应用程序中。
答案 1 :(得分:0)
以下是使用node-inspector调试V8的解决方案:
首先,最新版本(0.12.3)有很多用于调试node.js脚本的扩展,所以我使用了较旧的版本(0.5.0),它对node.js的责任较小。
我使用以下命令在Node.js命令提示符中安装v0.5.0:
npm install node-inspector@0.5.0
默认安装在“%USERPROFILE%\ node_modules”文件夹中。
我在%USERPROFILE%\ node_modules \ node-inspector \ lib \ PageAgent.js中添加了一行代码:
getResourceTree: function(params, done) {
return; //return empty tree
...
这样就完成了安装。
以下是调试使用ClearScript .NET库执行的javascript文件的指南:
打开命令提示符并执行以下命令:
%USERPROFILE%\ node_modules \的.bin \节点inspector.cmd
如果node-inspector成功运行,您应该看到以下行。
Node Inspector v0.5.0
info - socket.io started
Visit http://127.0.0.1:8080/debug?port=5858 to start debugging.
按照以下代码行(VB.NET代码)初始化V8引擎:
Dim engine As New V8ScriptEngine(“global”,V8ScriptEngineFlags.EnableDebugging,9222)
在代码中的这一行后面放一个断点,然后运行你的应用程序来达到这个断点。
确保你有“调试器”; JavaScript代码第一行中的语句。
打开Chrome浏览器并导航至以下地址:
http://127.0.0.1:8080/debug?port=9222
按下VİsualStudio工具栏中的“继续调试”按钮。
现在你应该看到你的脚本代码停在第一个“调试器”;在Chrome浏览器中输入。
您可以从此处继续调试。