2010-09-24 11 views
7

Realmente me gustaría ver cada método, delegado, notificación, etc. que se llama/envía mientras ejecuto mi aplicación en el simulador de iPhone. Pensé que el lugar correcto para esto sería en el depurador, pero no puedo encontrar la configuración correcta.¿Cómo veo todos los métodos invocados cuando ejecuto mi aplicación en el simulador de iPhone?

Mi objetivo es ver todo lo que sucede en el fondo mientras, por ejemplo, agrego una fila a una UITableView o presiono el botón 'atrás' desde mi UINavigationController.

Esto sería una gran ayuda para averiguar qué delegado a usar cuando algo en la aplicación está ocurriendo o cuando el usuario está presionando un botón, cambiar un punto de vista, etc.

¿Es posible obtener esta información ?

Respuesta

8

Puede cerrar la sesión de todo lo que sucede cuando su aplicación se ejecuta con DTrace, un marco que le permite explorar el funcionamiento interno de cualquier cosa que se ejecute en una Mac moderna. Todavía no tenemos DTrace en iOS, pero funcionará mientras se ejecuta dentro del simulador.

Describo los fundamentos de DTrace en this article para MacResearch, luego proporciono un ejemplo de un instrumento personalizado que puede compilar en Instruments usando DTrace cerca del final de this article. Ese instrumento registra todos los métodos invocados en todos los objetos (incluso los internos) desde el momento en que se inicia la aplicación hasta que llega al final de -applicationDidFinishLaunching:.

Para simplificar esto, puede simplemente crear un instrumento personalizado utilizando el elemento de menú Instrument | Build New Instrument en instrumentos.Configure uno de los descriptores de sonda para parecerse a lo siguiente:

alt text

sólo se ignoran los isInApplicationStart y de fecha y hora opciones de registro. Una simple sonda que responda a cualquier método de Objective-C en cualquier clase registrará todos esos mensajes en la consola de Instruments, que suena como lo que quiere para su depuración.

+0

¡gracias por tu respuesta! También lo intentaré cuando encuentre el tiempo. ¡Perdón por el retraso! – Micko

+0

Me da un error fatal. alguna idea – ramo

0

Si coloca un punto de interrupción en su aplicación, puede ver cómo cambia la pila de llamadas mientras revisa el código. Eso es probablemente lo más cercano a lo que tienes pensado.

+0

esta es la dirección correcta, pero aún así no le dará todas las cosas que estaban sucediendo. ¿Hay alguna otra cosa? – Micko

+0

Puede colocar un punto de interrupción en la primera línea de main() y literalmente pasar por cada línea de código y en cada llamada al marco. No sé qué más podrías querer ver. –

5

Suponiendo que usted está seguro de que quiere absolutamente todo ...

  1. punto de interrupción objc_msgSend y objc_msgSend_stret. Casi todas las llamadas a métodos utilizan esas dos funciones (murmullo silencioso de IMP-cacheing).
  2. Bien, ahora su aplicación cae en el depurador todo el tiempo. Entonces haz clic en el cuadro de autocontinuar.
  3. Pero ahora no ve mucho que sucede, edite los puntos de interrupción y agregue el comando "bt" para obtener una traza inversa.
  4. Drown in debug spam.

Esto no detectará otras funciones C, por supuesto.

Si lo que desea es la declaración de capturas, se puede hacer algo como esto (y mucho menos spam):

+(void)load 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleEveryNotification:) name:nil object:nil]; 
} 

+(void)handleEveryNotification:(NSNotification*)notification 
{ 
    CFShow(notification); 
} 

Por supuesto, las notificaciones se realizan con llamadas a métodos normales, por lo que el primer método también mostrarles (aunque en una gran pila de spam).

Los delegados no son llamados ni enviados; solo son llamadas normales al método Obj-C (estrictamente "envíos de mensajes", pero eso no tiene el mismo timbre).

+0

¡gracias por tu respuesta! Lo intentaré cuando encuentre el tiempo. ¡Perdón por el retraso! – Micko

+0

¿Es posible capturar otras funciones C? –

+0

@BenDowling Sure: Punto de corte en cada punto de entrada de la función. Encontrar estos será un poco más difícil. –

Cuestiones relacionadas