Как я могу взять минимизированную трассировку стека javascript и запустить ее против исходной карты, чтобы получить правильную ошибку?
На нашем производственном сервере я опубликовал миниатюрный javascript, и я не включаю в него файл карты, потому что я не хочу, чтобы пользователь мог понять, что происходит на основе ошибки.
У меня есть служба регистрации, которую я написал для пересылки исключений angular (пойманных $exceptionHandler) себе по электронной почте. Однако эта трассировка стека почти нечитаема:
n is not defined
at o (http://localhost:9000/build/app.min.js:1:3284)
at new NameController (http://localhost:9000/build/app.min.js:1:3412)
at e (http://localhost:9000/build/bower.min.js:44:193)
at Object.g.instantiate (http://localhost:9000/build/bower.min.js:44:310)
at b.$get (http://localhost:9000/build/bower.min.js:85:313)
at d.compile (http://localhost:9000/build/bower.min.js:321:23333)
at aa (http://localhost:9000/build/bower.min.js:78:90)
at K (http://localhost:9000/build/bower.min.js:67:39)
at g (http://localhost:9000/build/bower.min.js:59:410)
at http://localhost:9000/build/bower.min.js:58:480 <ui-view class="ng-scope">
Мне интересно: есть ли программа, в которой я могу проанализировать эту трассировку стека против фактического неминифицированного исходного кода через файл карты (или нет через файл карты, если есть другой способ)
Ответы
Ответ 1
Что вы хотите сделать, это разобрать исходные карты. Это не имеет ничего общего с веб-браузерами. Все, что вам нужно сделать, это перевести минимизированную ссылку в неинициализированный ресурс.
Если у вас есть опыт работы с NodeJS, уже есть пакет, который сделает это за вас.
https://github.com/mozilla/source-map/
Чтобы установить библиотеку
npm install -g source-map
или
yarn global add source-map
Создайте файл с именем "issue.js"
fs = require('fs');
var sourceMap = require('source-map');
var smc = new sourceMap.SourceMapConsumer(fs.readFileSync("./app.min.js.map","utf8"));
console.log(smc.originalPositionFor({line: 1, column: 3284}));
Запустите файл с узлом
node issue.js
Он должен выводить местоположение в исходном файле на консоль для первой строки трассировки стека.
Примечание: я говорю вам установить исходную карту глобально для простоты использования, но вы можете создать проект узла, который делает то, что вам нужно, и установить его локально.
Ответ 2
Если бы вы имели доступ к файлу исходной карты извне и могли получить ту же структуру файлов, что и вы могли бы ее решить, я думаю, но я не знаю никаких инструментов за пределами браузера, которые помогут вам в этом.
Дополнительное преимущество наличия данных в запущенном браузере позволит проверить локальные жители, которых вы не получите даже с исходной картой.
Для создания отчетов об ошибках вы можете рассмотреть такой инструмент, как rollbar. Это сообщит всем местным жителям в каждом фрейме, чтобы помочь отлаживать. Он поддерживает sourcemaps за пределами браузера для решения ваших проблем безопасности.
Ответ 3
Если добавить ответ @Reactgular, приведенный ниже фрагмент будет работать с последней версией карты источника
const rawSourceMap = fs.readFileSync("./app.min.js.map","utf8");
const whatever = sourceMap.SourceMapConsumer.with(rawSourceMap, null, consumer => {
console.log(consumer.originalPositionFor({
line: 1,
column: 3284
}));
});
И добавить к обсуждению в ветке простое регулярное выражение, например /\/(\w*[-\.]?\w*).js:\d*:\d*/g
Ниже приведено очень простое регулярное выражение для поиска всех номеров строк в трассировке стека.
//regex for patterns like utils.js, utils123.js, utils-name.js, utils.version.js
var patt = /\/(\w*[-\.]?\w*).js:\d*:\d*/g;
// returns matches like ['/app.min.js:1:3284', '/bower.min.js:44:193', ..]
var errorPositions = line.match(patt);
console.log(errorPositions);
if(!errorPositions || errorPositions.length === 0) {
console.log("No error line numbers detected in the file. Ensure your stack trace file is proper");
return;
}
errorPositions.forEach(function(error) {
findInSourceMap(error);
});
});
Ответ 4
Добавить директиву комментариев для запуска JS на странице.
//# sourceMappingURL =/путь/в/ваш/sourcemap.map
В firefox (не уверенный о хроме), чтобы сообщить отладчику использовать исходные карты, если они доступны, нажмите кнопку "Параметры отладчика" и выберите "Показать исходные источники" из списка всплывающих настроек: