Веб-библиотека отладки для JS
Я пытаюсь сделать веб-(Javascript) JS-интерпретатор и отладчик для учебных целей. Я запускаю программу на сервере nodejs. Часть интерпретатора просто выполняется командой "node file.js"
на child_process.exec()
,
Может кто-нибудь предложить хороший способ реализации отладчика? Если пользователь устанавливает точку останова, программа будет работать до этой точки и покажет значения переменной, которые уже были объявлены или изменены до этой точки выполнения.
Я попытался сделать это с помощью модуля uglify-js. Я бегу UglifyJS.minify(<file.js>[,{options}])
извлекать переменные, используемые в коде, и выводить их в консоли.
Я уже придумал следующий код для этой цели, но я искал какое-нибудь доступное решение с открытым исходным кодом. Кто-нибудь знает о какой-либо библиотеке, доступной для этой цели?
Файл: parser.js
var UglifyJS = require("uglify-js");
var exec = require('child_process').exec;
var fs = require('fs');
var allcode = new Object();
allcode.code = "";
allcode.vars = "";
var output = new Object();
output.data = "";
//THE BREAKPOINT MENTIONED BY USER
var tillLine = 3;
var i = 0;
var done = 0;
var filesuffix = "temp301";
var fileout = "output.log";
var child = Array();
var notAllowed = Array("console","log","eval");
fs.writeFileSync("./"+fileout, "");
fs.readFileSync('./demo.js').toString().split('\n').every(function (line) {
allcode.code += line + "\n";
output.data[i] = "";
allcode.vars = "";
fs.writeFileSync("./"+filesuffix+".js", allcode.code);
i++;
//ADD CODE ONLY UPTO THE MENTIONED LINE
if(i>tillLine)
{
return false;
}
else
{
return true;
}
});
//GET THE LIST OF USED VARIABLES
var minified = UglifyJS.minify("./"+filesuffix+".js",{outSourceMap: "out.js.map"});
var map = JSON.parse(minified.map);
map.names.forEach(function(variable){
if(notAllowed.indexOf(variable) == -1)
{
allcode.vars += "console.log('Value of "+variable+" is ' + "+variable+");\n";
}
});
fs.appendFileSync("./"+filesuffix+".js", allcode.vars);
//EXECUTE THE DEBUGGING CODE
child = exec("nodejs " + "./"+filesuffix+".js");
done = 1;
child.stdout.on('data', function(data) {
output.data += data;
});
child.stderr.on('data', function(data) {
output.err += data;
});
child.on('close', function(code) {
fs.writeFileSync("./"+fileout, JSON.stringify(output,null,'\t'));
console.log(output.data);
done = 0;
});
ФАЙЛ: demo.js
var x = 9;
var a = "The sum is ";
var y = 10;
var z = y*y + x;
console.log(a + z);
ВЫХОД:
admin@tomcat-PC:~/Desktop/node_app$ nodejs parser.js
Value of x is 9
Value of a is The sum is
Value of y is 10
Value of z is 109
1 ответ
Я бы просто попытался вставить вызов функции в код пользователя в точке, где ожидается отладочное действие.
Функция будет перечислять и печатать локальные переменные контекста вместе с любой другой полезной информацией.
Я бы попытался добавить вставленный код после выбранной точки с запятой, чтобы не изменять номера строк ниже.