Печать журнала функций / трассировки стека для всей программы с помощью firebug

94

Firebug имеет возможность регистрировать вызовы определенного имени функции. Я ищу ошибку, которая иногда останавливает рендеринг страницы, но не вызывает ошибок или предупреждений. Ошибка появляется только в половине случаев. Итак, как мне получить список всех вызовов функций для всей программы или какую-то трассировку стека для выполнения всей программы?

Amccormack
источник

Ответы:

218

Firefox предоставляет console.trace() что очень удобно для печати стека вызовов. Он также доступен в Chrome и IE 11 .

В качестве альтернативы попробуйте что-то вроде этого:

function print_call_stack() {
  var stack = new Error().stack;
  console.log("PRINTING CALL STACK");
  console.log( stack );
}
Мэтт Шварц
источник
3
Есть ли способ увеличить длину стека? Это было бы очень полезно.
Рави Теджа
✚1 console.warn ('[ПРЕДУПРЕЖДЕНИЕ] СТЕК ВЫЗОВОВ:', новая ошибка (). Стек);
user1742529 06
13

Когда мне нужна трассировка стека, я делаю следующее, возможно, вы сможете почерпнуть из нее какое-то вдохновение:

function logStackTrace(levels) {
    var callstack = [];
    var isCallstackPopulated = false;
    try {
        i.dont.exist += 0; //doesn't exist- that's 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'));
    }
};

Примечание модератора : код в этом ответе, кажется, также появляется в этом сообщении из блога Эрика Вендерлина . Автор этого ответа утверждает, что это его собственный код, написанный до публикации в блоге, указанной здесь. Из соображений доброй воли я добавил ссылку на сообщение и эту заметку.

Мартин Есперсен
источник
2
В Firebug есть вызов console.trace (), который делает это.
amccormack
Это великолепно. У Firebug проблемы с минифицированными файлами, этот скрипт справляется!
pstadler
1
FWIW @ andrew-barber, автор ответа никогда не называл себя своим. Только не приписал. Ваша правка должна быть комментарием.
Ascherer
7

Я сделал это без firebug. Протестировано как в Chrome, так и в Firefox:

console.error("I'm debugging this code.");

Как только ваша программа напечатает это на консоли, вы можете щелкнуть маленькую стрелку, чтобы развернуть стек вызовов.

сатнам
источник
2

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

касабланка
источник
2
Это. Определенно добавьте console.log('something')к своим функциям множество операторов, чтобы увидеть, какие из них (а какие нет) вызываются
Гарет
1
Программа огромна, поэтому я ищу способ сравнить журналы функций, когда программа работала правильно, а когда нет.
amccormack
1
Я согласен, что это было бы полезно. Я вступаю в должность, чтобы стать владельцем большой базы кода, и что-то, что может генерировать текущую трассировку всех вызовов функций, безусловно, поможет получить представление о потоке / форме кода и обнаружить мертвый код.
Мэтью Николс,
1

Попробуй это:

console.trace()

Я не знаю, поддерживается ли он во всех браузерах, поэтому сначала проверю, существует ли он.

Авраам Альберо
источник