2012-03-11 19 views
6

Mi aplicación contiene un error que hace que el script se ejecute infinitamente largo. Cuando obligo a detener el script, todos los elementos de jQuery UI no responden a mis acciones, ni la aplicación responde a las pulsaciones de teclas.¿Cómo encontrar un error raro?

Si elijo abrir Firebug, se requiere volver a cargar la página y se pierde todo el estado actual de la aplicación.

El problema es que no puedo reproducir este error y me está volviendo loco. ¿Cómo encontrar y corregir ese error astuto?

ACTUALIZACIÓN. Gracias a todos por el consejo. Pero el problema es que no puedo descubrir cuándo ocurre un error y, por lo tanto, no puedo reproducirlo. Es por eso que los procedimientos estándar no funcionarán en mi caso.

He examinado cada ciclo de bucle y llamadas a funciones recursivas, pero aún no he resuelto el problema.

Publicar el código no es una buena idea: el listado de códigos es enorme y bastante complicado (un juego).

SOLUCIÓN POSIBLE. Seguiré uno de los consejos publicados e intentaré registrar todas las funciones que podrían estar causando el problema. Espero eso ayude.

+2

¿Podría publicar su código? –

+2

+1. Demasiadas preguntas simplemente solicitan la solución del problema en lugar de cómo depurarlo. – maxedison

+2

, facilite un http://sscce.org/ :) –

Respuesta

0

Infinito mucho tiempo, significa,

creo que alguna función está recibiendo llamadas de forma recursiva o algún evento es ser despedido de forma recursiva. Para seguir hacia abajo,

  1. Trate de poner console.log en todas las funciones, que están recibiendo llamadas de window.onload o document.ready (si está utilizando jQuery).
  2. Use Firebug's profile, que le indicará cada llamada a función que esté sucediendo.
+0

'Profile' se bloqueará con infinito bucle/recursión y apenas ayudará. – kirilloid

6

Hay dos enfoques principales para hacer frente a esta:

  1. Set break points y recorrer el código
  2. empezar a comentar ciertas secciones de código. Una vez que comente una sección que elimina el error, empiece comentando partes más pequeñas de esa sección hasta que llegue a la línea de código que está causando el problema.

También podría ayudar saber qué es lo que está buscando. Por lo general, una secuencia de comandos que se ejecuta en forma infinita se debe a una de estas dos cosas:

  1. Un bucle que nunca termina.
  2. Una función que se llama

Mantener un ojo para estas cosas podrían ayudar al proceso de depuración ir un poco más rápido. ¡Buena suerte!

+0

¿Cómo se configuran puntos de interrupción y se recorre el código sin abrir Firebug y volver a cargar la página? –

+0

A menos que la página se congele a primera vista con la carga. Usted carga la página, establece los puntos de interrupción, luego actualiza e investiga las acciones que conducen al comportamiento con errores. – kontur

+0

Como dijo @kontur, establezca los puntos de interrupción * antes de * que comience a interactuar con la página (inmediatamente después de cargar la página). – maxedison

2
  • romper su código en trozos y determinar cuál provoca un fallo. como por ejemplo, si tiene un formulario con varios campos que tienen selectores de fechas y autocompletado, desglose uno por uno. Censura cero sobre quién lo causa.

  • utilice la línea de tiempo del depurador. navegue por su sitio con la línea de tiempo para registrar el rendimiento de su página. Verás en la línea de tiempo qué tarea lleva demasiado tiempo. el navegador puede bloquearse cuando encuentre el error, pero al menos verá un poco de lo que sucedió cuando.

  • intente recrear sus acciones. haga una lista de control paso a paso sobre cómo navegar. De esta forma, puede rastrear en el código la ruta posible que tomó su secuencia de comandos cuando hizo su movimiento. si solo JS tuviera un back-trace como PHP, sería más fácil.

  • intenten revisar su código.cosas como bucles, recursiones o incluso dos funciones llamándose entre sí pueden causar este ciclo interminable.

  • si puede, use una herramienta VCS como SVN o GIT. puedes construir fácilmente y 'romper tu código sin la preocupación de perder una versión funcional. puede revertir fácilmente si usa VCS.

0

Siempre busco funciones que puedan llamarse con demasiada frecuencia o bucles que nunca dejan de repetirse. Luego, lleve un registro de cuántas veces se ejecutan sus supuestos funciones/bucles. Ejemplo:

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 
     } 
    } 

(sustituir "esta función/bucle" con algún identificador específico si se va a monitorear múltiples sospechosos)

0

A) de uso WebKit (Safari, Chrome, Chromium) inspector en lugar de firebug - n mas recarga, yay!

B) Establezca algún resultado de depuración en el camino que ayudará a reducir su problema al perpetrador.

0

Firebug. Recargar? ¿No intentó abrir Firebug antes de cargar la página?

Cuestiones relacionadas