Как найти редкую ошибку? - PullRequest
6 голосов
/ 11 марта 2012

Мое приложение содержит ошибку, из-за которой скрипт работает бесконечно долго.Когда я заставляю скрипт останавливаться, все элементы пользовательского интерфейса jQuery не отвечают на мои действия, а приложение не отвечает на нажатия клавиш.

Если я решу открыть Firebug, потребуется перезагрузить страницу, и все текущее состояние приложения будет потеряно.

Дело в том, что я не могу воспроизвести эту ошибку, и это сводит меня с ума.Как найти и исправить такую ​​хитрую ошибку?

ОБНОВЛЕНИЕ. Спасибо всем за совет.Но проблема в том, что я не могу понять, когда возникает ошибка, и, следовательно, не могу ее воспроизвести.Вот почему стандартные процедуры не будут работать в моем случае.

Я изучил каждый цикл while и вызовы рекурсивных функций, но еще не выяснил проблему.

Публикация кода не выполняется 'Хорошая идея - листинг кода огромен и довольно сложен (игра).

ВОЗМОЖНОЕ РЕШЕНИЕ. Я буду следовать одному из опубликованных советов и постараюсь консольлогировать все функции, которые могутбыть причиной проблемы.Надеюсь, это поможет.

Ответы [ 6 ]

6 голосов
/ 11 марта 2012

Существует два основных подхода к решению этой проблемы:

  1. Установите точки останова и пошагово выполняйте код
  2. Начните комментировать определенные разделы кода.Как только вы закомментируете раздел, который устраняет ошибку, начните комментировать меньшие фрагменты этого раздела, пока не дойдете до строки кода, которая вызывает проблему.

Это также может помочь узнать, что выищем.Бесконечно выполняемый скрипт обычно возникает в результате одной из двух вещей:

  1. Цикл, который никогда не заканчивается.
  2. Функция, которая вызывает себя

Сохранениеобратите внимание на эти вещи, которые могут помочь процессу отладки пройти немного быстрее.Удачи!

2 голосов
/ 11 марта 2012
  • разбить ваш код на куски и определить, какой из них вызывает сбой. как, например, если у вас есть форма с несколькими полями, которые имеют средства выбора даты и автозаполнения, разберите их по одному. Нацелен на то, кто его вызывает.

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

  • попытайтесь воссоздать ваши действия. составьте пошаговый контрольный список о том, как вы проходите. таким образом, вы можете отследить в коде возможный путь, по которому ваш скрипт шел, когда вы делали это. если бы только JS имел обратную трассировку, такую ​​как PHP, это было бы проще.

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

  • если вы можете, используйте инструмент VCS, такой как SVN или GIT. Вы можете легко собрать и сломать свой код, не беспокоясь о потере рабочей версии. Вы можете легко вернуться, если вы используете VCS.

0 голосов
/ 11 марта 2012

Firebug. Перегрузочный? Разве вы не пытались открыть Firebug до загрузки страницы?

0 голосов
/ 11 марта 2012

A) Используйте инспектор WebKit (Safari, Chrome, Chromium) вместо firebug - больше не нужно перезагружаться, ууу!

B) Установите некоторые выходные данные отладки по пути, который поможет сузить вашу проблему до исполнителя,

0 голосов
/ 11 марта 2012

Я всегда ищу функции, которые могут вызываться слишком часто, или циклы, которые никогда не прекращают цикл.Затем следите за тем, сколько раз ваши подозреваемые функции / циклы выполняются.Пример:

    var runCount = 0;
    function guiltyLookingFunction(params)
    {
        runCount++; //increase by 1 every time this function runs
        if (runCount>1000) //if this has run some insane number of times
            alert("this function is the that's running wild!");

        //the rest of your function's code

        //same thing with loops within functions:
        var loopCount = 0;
        while (0!=1)  //this will always be true, so the loop won't stop!
        {
            loopCount++;
            if (loopCount>1000)
                alert("this loop is to blame!");

            //the rest of your loop
        }
    }

(замените «эту функцию / цикл» на определенный идентификатор, если вы отслеживаете несколько подозреваемых)

0 голосов
/ 11 марта 2012

Бесконечно долго, значит,

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

  1. Попробуйте ввести console.log во все функции, которые вызываются из window.onload или document.ready (если вы используете jquery).
  2. Используйте Firebug profile, который сообщит вам о каждом вызове функции, который происходит.
...