Firebug имеет возможность регистрировать вызовы для определенного имени функции. Я ищу ошибку, которая иногда останавливает страницу из рендеринга, но не вызывает никаких ошибок или предупреждений. Ошибка появляется примерно в половине случаев. Итак, как мне получить список всех вызовов функций для всей программы или какую-то трассировку стека для выполнения всей программы?
Печать журнала функций/трассировка для всей программы с использованием firebug
Ответ 1
Firefox предоставляет console.trace()
, что очень удобно для печати стека вызовов. Он также доступен в Chrome и IE 11.
Альтернативно попробуйте что-то вроде этого:
function print_call_stack() {
var stack = new Error().stack;
console.log("PRINTING CALL STACK");
console.log( stack );
}
Ответ 2
Когда мне нужна трассировка стека, я делаю следующее, может быть, вы можете черпать вдохновение:
function logStackTrace(levels) {
var callstack = [];
var isCallstackPopulated = false;
try {
i.dont.exist += 0; //doesn't exist- that the point
} catch (e) {
if (e.stack) { //Firefox / chrome
var lines = e.stack.split('\n');
for (var i = 0, len = lines.length; i < len; i++) {
callstack.push(lines[i]);
}
//Remove call to logStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
else if (window.opera && e.message) { //Opera
var lines = e.message.split('\n');
for (var i = 0, len = lines.length; i < len; i++) {
if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
var entry = lines[i];
//Append next line also since it has the file info
if (lines[i + 1]) {
entry += " at " + lines[i + 1];
i++;
}
callstack.push(entry);
}
}
//Remove call to logStackTrace()
callstack.shift();
isCallstackPopulated = true;
}
}
if (!isCallstackPopulated) { //IE and Safari
var currentFunction = arguments.callee.caller;
while (currentFunction) {
var fn = currentFunction.toString();
var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
callstack.push(fname);
currentFunction = currentFunction.caller;
}
}
if (levels) {
console.log(callstack.slice(0, levels).join('\n'));
}
else {
console.log(callstack.join('\n'));
}
};
Заметка модератора. Код в этом ответе также появляется в этой записи из блога Эрика Вендерлина. Автор этого ответа утверждает это как свой собственный код, хотя, написанный до сообщения в блоге, связанного здесь. Для целей добросовестности я добавил ссылку на сообщение и эту заметку.
Ответ 3
Попробуйте выполнить один или несколько кодов одной строки или одной функции, чтобы определить, где она перестает работать правильно. Или сделайте несколько разумных догадок и разбросанных операторов регистрации через ваш код.
Ответ 4
Я сделал это без firebug. Протестировано как в хроме, так и в firefox:
console.error("I'm debugging this code.");
Как только ваша программа выведет это на консоль, вы можете щелкнуть по ней маленькую стрелку, чтобы развернуть стек вызовов.