iphone - porque - ¿Cómo usar MallocStackLogging en el dispositivo?
me olvide el codigo de restricciones del iphone (3)
Así es como depuro APP 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.
Necesita un ideario jailbreak con herramientas de desarrollador instaladas, luego tiene gdb.
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 privilegios de root a su aplicación.
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
Cambia el nombre de tu programa
mv YOUR_APP.app/YOUR_APP YOUR_APP.app/BACK_UP_NAME
Use un scrip de shell corto para iniciar su programa, para que podamos 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
Hecho.
Simplemente inicie su aplicación, toque el ícono o use el comando abrir, verá un archivo de registro de pila en el directorio / tmp.
Use ps aux | grep YOUR_APP
ps aux | grep YOUR_APP
find id de proceso, gdb -p PROCESS_ID
adjunta al progreso, gdb -p PROCESS_ID
un punto de interrupción, prueba info malloc ADDRESS
, se mostrará el historial de malloc.
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.
Establecí la variable de entorno MallocStackLogging
y el iPhone registra correctamente 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 Mac usando el Xcode Organizer. Pero, ¿qué debería hacer con estos dos archivos?
- stack-logs.1856.MyApp.index
- stack-logs.1856.MyApp.e8z3IL.link
Intenté mover los archivos en / tmp en la 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?
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.
No pretendo sonar impertinente, pero ¿ha intentado enchufar el dispositivo y ejecutarlo bajo el depurador mientras estaba conectado?
Hago una depuración extensiva mientras ejecuté la aplicación en el dispositivo. Necesita iniciar la aplicación bajo el depurador.