Как отследить Heisenbug в сценарии jQuery? - PullRequest
2 голосов
/ 09 февраля 2012

Мне нужна помощь. У меня есть Heisenbug в моем коде. Он появляется только время от времени и не может быть запущен намеренно.

FireBug генерирует исключение типа «Указана неверная или недопустимая строка» и ссылается на строку внутри jQuery , которая выглядит следующим образом:

} else {

В любом случае, я был бы признателен за любую помощь! Я уже пробовал с FireQuery, но это мешает моему коду, так что это не вариант.

// РЕДАКТИРОВАТЬ: упомянутое местоположение прыгает вокруг и не имеет никакого отношения к самой ошибке.

// РЕДАКТИРОВАТЬ: я отследил его до строки, которая выглядит следующим образом:

context.fillText("[[*longtitle]]", x + 4, y + h + 15, w);

Я использую MODX CMS для создания этого сайта (вот откуда [[* longtitle]] и [[* id]] и все остальное; они являются шаблонными заполнителями). Вот полная функция этой строки:

($("imagecvs-[[*id]]").ready(function() {
    var canvas = $("#imagecvs-[[*id]]").get(0);
    if (canvas.getContext) {
    var context = canvas.getContext('2d');
    var img = new Image();

    img.src = "[[*Photo]]";

    var scale = 0.6;
    var ratio = img.width / img.height;

    var w = Math.min(img.width * scale, 120);
    var h = w / ratio;
    var x = 0;
    var y = (canvas.height / 2.0) - (h / 2.0);

    var deg = -8;
    var rad = (deg * Math.PI / 180);
    // y += (h / 2) * -Math.sin( rad );
    context.rotate(rad);

    context.fillStyle = "#FFF";
    context.fillRect(x - 5, y - 5, w + 10, h + 30);
    context.drawImage(img, x, y, w, h);

    context.font = "Italic Bold 10px Serif";
    context.textAlign = "left";
    context.textBaseline = "ideographic";
    context.fillStyle = "#000";
    context.fillText("This is a test", x + 4, y + h + 15, w); // Exception thrown here; even with 'This is a test'
    }
    return true;
  }));

Еще немного информации: я использую FireFox 10.0. Сайт находится по адресу http://www.roboter -club-hamburg.de .

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Хорошо, я нашел причину этой ошибки. Это было вызвано тем, что изображение (img) иногда загружалось не полностью в тот момент, когда скрипт запрашивал его ширину и высоту. Следовательно, оба были NaN, и скрипт потерпел крах (fillText, очевидно, не работает с шириной NaN).

Теперь все, что я сделал, чтобы решить эту проблему, - это переместил шаги рисования в обратный вызов img. Это работает. Этого Гейзенбуга больше нет.

Большое спасибо!

0 голосов
/ 09 февраля 2012

Сейчас я не знаю, как это сделать в FireBug, но в WebKit Web Inspector ( здесь для FireBug ) вы можете выбрать исключение.

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

...