Pregunta ¿Cómo usar MallocStackLogging en el dispositivo?


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.

He establecido el MallocStackLogging variable de entorno 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 malloc_history comando 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?


32
2018-03-02 12:38


origen


Respuestas:


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.

  1. Necesita un ideario jailbreak con herramientas de desarrollador instaladas, luego 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 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 icono o use el comando abrir, verá un archivo de registro de pila en / tmp directorio.

Utilizar ps aux | grep YOUR_APP encontrar la identificación del proceso, gdb -p PROCESS_ID adjuntar al progreso, hacer un punto de interrupción, probar info malloc ADDRESS, la historia de Malloc aparecerá.


4
2018-03-05 11:39



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.


2
2017-09-16 18:56



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.


-3
2018-03-14 09:44