Есть ли способ записать трассировку стека JavaScript без установки точек останова? - PullRequest
8 голосов
/ 17 сентября 2011

Я хотел бы иметь возможность выполнять манипуляции с данным JS-приложением, а затем просто получать большой журнал всех вызванных функций.Это возможно в Chrome, но только если кто-то ставит точку останова где-нибудь.Моя проблема в том, что когда я занимаюсь реинжинирингом данного веб-сайта (конечно, только для самообучения), мне часто требуется много времени, чтобы понять, с чего начать.Нечто подобное очень сильно поможет мне, потому что мне больше не придется искать в коде, скорее я просто сделаю пользовательское действие и впоследствии получу журнал стека.

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

Ответы [ 4 ]

2 голосов
/ 06 октября 2011
0 голосов
/ 12 октября 2011

Вы можете использовать Dynatrace. Dynatrace - инструмент профилирования для IE и FF. Dynatrace может отслеживать ваше приложение во время его работы, а затем отображать временные рамки всего, что произошло. На временной шкале есть блоки, представляющие активность javascript. Вы можете щелкнуть по нему правой кнопкой мыши (purepath), а затем пройти весь стек вызовов. Вы можете экспортировать это в Excel или другое, если хотите. Вы можете добавить маркеры в свой код, эти маркеры появятся на временной шкале и в чистом пути: if (typeof (_dt_addMark)! = "undefined") _dt_addMark ('MyCustomTimerName');

альтернативно, если вы хотите найти только «способ перехвата (или переноса) каждого вызова функции», Существует низкотехнологичное решение, если вы используете реальное веб-приложение (приложение javascript с одной загрузкой): букмарклеты

В букмарклетах, как только вы загрузите свою страницу, вы можете выполнить некоторый пользовательский JavaScript. Итак, что вы можете сделать там, это переопределить методы функций, которые вы хотите наблюдать, с помощью той же функции, содержащей журналирование (так что просто скопируйте и вставьте функцию и добавьте туда console.log). Это на самом деле работает даже с нативными функциями js.

0 голосов
/ 17 сентября 2011

Возможно, аспектно-ориентированное программирование (AOP) может дать ответ.Я только что узнал о aspectJS , который может помочь перехватывать и регистрировать вызовы функций

0 голосов
/ 17 сентября 2011

В Firebug вы можете использовать профилировщик для регистрации каждой вызванной функции.Используйте console.profile() и console.profileEnd() для программного запуска.

Однако, это не даст вам правильных трассировок стека.(Вы уверены, что это то, что вы хотите?)

Чтобы регистрировать методы конкретных объектов, вы можете перезаписать их так:

for (var key in obj) {
    if (typeof obj[key] == 'function') {
        (function(){
            var origFun = obj[key];
            obj[key] = function () {
                var result = origFun.apply(this, arguments);
                console.log('call to method', key, 'with arguments', arguments,' - Result:', result);
                // console.trace(); // for a trace with every call
                return result;
            };
        })();
    }
}
...