2011-03-02 8 views
32

Tengo un problema de memoria en una aplicación de iPhone que me gustaría depurar con MallocStackLogging. El error involucra el giroscopio, así que tengo que depurar en el dispositivo, no en el simulador.¿Cómo usar MallocStackLogging en el dispositivo?

He configurado la variable de entorno MallocStackLogging y el iPhone registra adecuadamente los registros de la pila Mallock:

MyApp(1856) malloc: recording malloc stacks to disk using standard recorder 
MyApp(1856) malloc: stack logs being written into /private/var/mobile/Applications/1FD1F8D2-5D30-4AA7-B426-C52FE20266DE/tmp/stack-logs.1856.MyApp.index 
MyApp(1856) malloc: Please issue: cp /private/var/mobile/Applications/1FD1F8D2-5D30-4AA7- B426-C52FE20266DE/tmp/stack-logs.1856.MyApp.e8z3IL.link /tmp/ 

Ahora ¿Cómo puedo trabajar con ellos?

Puedo transferirlos a la Mac usando el Xcode Organizer. Pero, ¿qué debería hacer con estos dos archivos?

  • pila-logs.1856.MyApp.index
  • stack-logs.1856.MyApp.e8z3IL.link

he intentado mover los archivos en/tmp en el Mac, y llamó:

$ malloc_history 1856 -all_events 
malloc_history cannot examine process 1856 because the process does not exist. 

Claramente, el comando malloc_history busca procesos en ejecución en la máquina local. Me falta una opción para especificar el archivo de registro manualmente.

¿Hay alguna manera de hacer que esto funcione ya sea directamente trabajando con Xcode en el dispositivo (sin jailbreak) o después de transferir los registros a la Mac?

+0

Sufrí el mismo problema con el simulador. Estaremos ansiosos por obtener algunas respuestas de personas aquí. Por cierto, seguí este enlace: http://www.numbergrinder.com/node/53 –

+0

Miré a mi alrededor y lo intenté por mí mismo ... parece que no se puede, no sé qué tan buenos son los archivos de registro si no puedes leerlos ... shell en el depurador no es bueno, porque ese no es el shell en el dispositivo, es tu bash local ... aunque desmantelado ... He intentado importar los archivos de registro en instrumentos, sin dados. –

+0

Empiezo a creer que * malloc_history * solo funciona si su aplicación se ejecuta en el simulador. Cuando se está ejecutando la aplicación en el dispositivo, no creo que haya una forma de señalar malloc_history al dispositivo. – Raphael

Respuesta

4

Así es como depuro la aplicación con malloc stack history en idevice, es realmente complicado, pero no tengo otra manera de lidiar con un problema de memoria del grupo de versiones automáticas.

  1. Necesita un ideario de jailbreak con herramientas de desarrollador instaladas, entonces tiene gdb.

  2. Para habilitar el registro de la pila malloc, necesita establecer las variables de entorno MallocStackLoggingNoCompact y MallocStackLogging, necesitamos algún truco para hacerlo.

Primero, necesitamos otorgarle a su aplicación el privilegio de root.

mv -f /User/Application/xxxxxxxxxxxxx/YOUR_APP.app /Application/YOUR_APP.app 
cd /Application 
chown -R root:wheel YOUR_APP.app 
chmod 4755 YOUR_APP.app/YOUR_APP 

Cambiar el nombre de su programa

mv YOUR_APP.app/YOUR_APP YOUR_APP.app/BACK_UP_NAME 

Utilice una receta corta la cáscara de empezar el programa, por lo que puede mantener el env. Guárdalo en YOUR_APP.app/YOUR_APP

#!/bin/bash 
export MallocStackLogging=1 
export MallocStackLoggingNoCompact=1 

exec /Applications/YOUR_APP.app/BACK_UP_NAME 

Listo.

Simplemente inicie su aplicación, toque el icono o use el comando abrir, verá un archivo de registro de pila en el directorio/tmp .

Utilice ps aux | grep YOUR_APP busque la identificación del proceso, gdb -p PROCESS_ID conecte al progreso, haga un punto de interrupción, intente info malloc ADDRESS, se mostrará la historia de malloc.

+0

gracias, intentaremos alguna vez ... –

-3

No pretendo sonar impertinente, pero ¿ha intentado enchufar el dispositivo y ejecutarlo debajo del depurador mientras estaba conectado?

Realizo una depuración exhaustiva mientras ejecuté la aplicación en el dispositivo. Necesita iniciar la aplicación bajo el depurador.

+1

La depuración normal en el dispositivo por supuesto funciona sin problemas. Entonces, por supuesto, estoy empezando bajo el depurador. Mi problema específico es con 'malloc_history'. –

2

En la aplicación Instruments, que puede diagnosticar una aplicación que se ejecuta en el simulador o en un dispositivo, el instrumento Allocations registra las direcciones de memoria y los historiales de asignación. Puede navegar por tipo de objeto/asignación o dirección de memoria específica. Esta es probablemente la forma más directa de lograr lo que desea.

Ejecutar malloc_history en el dispositivo requeriría jailbreak para habilitar una conexión ssh al dispositivo, o ejecutar malloc_history desde su código. Pero no estoy seguro de si malloc_history existe en un dispositivo iOS. Y el texto de ayuda de malloc_history no menciona una opción para operar en archivos de registro en lugar de un proceso existente, que probablemente ya conozca.

+0

Los instrumentos parecen ser muy pesados, lo que hace que la aplicación funcione muy lentamente en comparación con solo iniciar sesión en la pila malloc. Y en algunos casos, un problema de memoria evasivo no se puede replicar utilizando Instruments. – jk7

Cuestiones relacionadas