2010-12-08 8 views

Respuesta

4

Puede establecer puntos de interrupción por subproceso con la consola gdb. Por ejemplo:

b -[UIView layoutSubviews] thread 2 

(Se utiliza el BGF "info threads" comandos para ver qué temas y qué existe GDB identificador utiliza para ellos).

No creo que haya una manera de establecer un punto de interrupción para cada subproceso excepto que el hilo principal (rosca 1), pero si usted tiene un número razonable de las discusiones que podrían establecer puntos de interrupción para cada uno de ellos individualmente si es necesario .


actualización:

Si la cosa por subproceso no está funcionando debido a GCD, otro enfoque que podría tomar sería simplemente establecer un punto de interrupción regular y fijar GDB para ese punto de ruptura descargue una traza inversa ("dónde") y luego "continuar".

+0

Gracias por su respuesta! Dos preguntas: ¿Es normal que la velocidad de ejecución se reduzca considerablemente, hasta una posición inmóvil completa? Creé puntos de interrupción en '-layoutSubviews' como sugirió para todos mis hilos en ejecución, ninguno de ellos se activó todavía. En segundo lugar, ¿es correcto que no puedo establecer puntos de corte para hilos que aún no existen? Lo que lo haría bastante inútil en el caso de GCD donde los hilos se engendran y terminan regularmente. –

+0

Buena pregunta. No lo sé, pero sospecho que el mecanismo de puntos de corte por subproceso funciona estableciendo un punto de interrupción regular y luego haciendo que gdb pruebe el ID del hilo actual (y continúe silenciosamente si no es el hilo correcto); Puedo ver cómo eso se pondría caro. No sé cómo configurar puntos de interrupción para hilos que no existen. –

+0

Gracias, su respuesta fue útil sin embargo. Observé sin embargo que Xcode no funciona bien con esos puntos de interrupción. En el próximo lanzamiento de la aplicación, agrega estos puntos de interrupción de nuevo, pero sin respetar el parámetro del hilo. Entonces los puntos de interrupción terminan siendo activos para todos los hilos. Sin embargo, es mejor que nada para encontrar esas desagradables llamadas a UIKit en errores no principales. –

1

Hay a very useful bit of code que cumple exactamente lo que está solicitando. También es mucho más rápido que usar puntos de interrupción. Lo hace mediante el método swizzling unos pocos métodos UIKit (setNeedsLayout, setNeedsDisplay, etc.) y lanzando una aserción si se llama a alguno en un hilo que no sea el hilo principal.

Funciona muy bien para detectar estos tipos de defectos durante el desarrollo, pero asegúrese de recordar eliminarlo del código de producción. También es trivial adaptarse a AppKit si es necesario.

Cuestiones relacionadas