0

Я пытаюсь создать на основе JS-интерпретатора и отладчика веб-интерфейс (Javascript) для учебных целей. Я запускаю программу на сервере nodejs. Часть интерпретатора просто выполняется, выполнив команду "node file.js" на child_process.exec().Веб-библиотека отладки для JS

Может ли кто-нибудь предложить хороший способ реализовать отладчик? Если пользователь устанавливает точку останова, программа будет работать до этой точки и будет показывать значения переменной, которая уже была объявлена ​​или изменена до этой точки выполнения.

Я попытался сделать это с помощью модуля 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; 

}); 

FILE: demo.js

var x = 9; 
var a = "The sum is "; 
var y = 10; 
var z = y*y + x; 
console.log(a + z); 

ВЫВОД:

[email protected]:~/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 

ответ

0

Просто в верхней части голова, я бы попытался вставить вызов функции в код пользователя, в тот момент, когда ожидается отладочное действие.
Функция будет перечислять и печатать локальные переменные контекста вместе с любой другой полезной информацией.
Я попытался бы добавить вставленный код после выбранной точки с запятой, чтобы не изменять номера строк ниже.

 Смежные вопросы

  • Нет связанных вопросов^_^