Simbolizando informes de fallas de aplicaciones de iPhone
Estoy buscando intentar simbolizar los informes de fallos de mi aplicación de iPhone.
Recuperé los informes de fallos de iTunes Connect. Tengo el binario de la aplicación que envié a la App Store y tengo el archivo dSYM que se generó como parte de la compilación.
Tengo todos estos archivos juntos dentro de un único directorio indexado por Spotlight.
¿Ahora que?
He intentado invocar:
symbolicatecrash crashreport.crash myApp.app.dSYM
y simplemente genera el mismo texto que está en el informe de fallo para empezar, no simbolizado.
¿Estoy haciendo algo mal?
Pasos para analizar el informe de fallos de Apple:
Copie el archivo .app de lanzamiento que se envió a la tienda de aplicaciones, el archivo .dSYM que se creó en el momento del lanzamiento y el informe de fallas recibido de APPLE en una CARPETA .
ABRA la aplicación de terminal y vaya a la carpeta creada anteriormente (usando
cd
el comando)Correr
atos -arch armv7 -o APPNAME.app/APPNAME MEMORY_LOCATION_OF_CRASH
. La ubicación de la memoria debe ser aquella en la que la aplicación falló según el informe.
Ex: atos -arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508
Esto le mostrará la línea exacta y el nombre del método que provocó el bloqueo.
Ex:[classname functionName:]; -510
Simbolizando IPA
si usamos IPA para simbolizar, simplemente cambie el nombre de la extensión .ipa con .zip, extráigala y luego podremos obtener una carpeta de carga útil que contiene la aplicación. En este caso no necesitamos el archivo .dSYM.
Nota
Esto sólo puede funcionar si el binario de la aplicación no tiene símbolos eliminados. De forma predeterminada, las versiones de lanzamiento eliminaron los símbolos. Podemos cambiarlo en la configuración de compilación del proyecto "Eliminar símbolos de depuración durante la copia" a NO.
Más detalles ver esta publicación
Después de leer todas estas respuestas aquí para simbolizar un registro de fallas (y finalmente tener éxito), creo que faltan algunos puntos que son realmente importantes para determinar por qué la invocación de simbólicatecrash no produce una salida simbolizada.
Hay tres elementos que deben encajar al simbolizar un registro de fallos:
- El archivo de registro de fallos en sí (es decir
example.crash
), exportado desde el organizador de XCode o recibido desde iTunes Connect. - El
.app
paquete (es decirexample.app
, ) que contiene el binario de la aplicación que pertenece al registro de fallos. Si tiene un.ipa
paquete (es decirexample.ipa
), puede extraerlo.app
descomprimiéndolo.ipa
(es decirunzip example.ipa
). Luego, el.app
paquete reside en laPayload/
carpeta extraída. - El
.dSYM
paquete que contiene los símbolos de depuración (es decirexample.app.dSYM
, )
Antes de comenzar la simbolización, debes verificar si todos esos artefactos coinciden, lo que significa que el registro de fallas pertenece al binario que tienes y que los símbolos de depuración son los que se produjeron durante la compilación de ese binario.
Cada binario está referenciado por un UUID que se puede ver en el archivo de registro de fallos:
...
Binary Images:
0xe1000 - 0x1f0fff +example armv7 <aa5e633efda8346cab92b01320043dc3> /var/mobile/Applications/9FB5D11F-42C0-42CA-A336-4B99FF97708F/example.app/example
0x2febf000 - 0x2fedffff dyld armv7s <4047d926f58e36b98da92ab7a93a8aaf> /usr/lib/dyld
...
En este extracto, el registro de fallos pertenece a una imagen binaria de la aplicación denominada example.app/example con UUID aa5e633efda8346cab92b01320043dc3
.
Puedes consultar el UUID del paquete binario que tienes con dwarfdump:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
Luego debes verificar si los símbolos de depuración que tienes también pertenecen a ese binario:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
En este ejemplo, todos los activos encajan y debería poder simbolizar su seguimiento de pila.
Continuando con el symbolicatecrash
guión:
En Xcode 8.3 deberías poder invocar el script a través de
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
Si no está allí, puede ejecutar find . -name symbolicatecrash
en su directorio Xcode.app para encontrarlo.
Como puede ver, no se proporcionan más parámetros. Por lo tanto, el script debe encontrar los símbolos binarios y de depuración de su aplicación ejecutando una búsqueda destacada. Busca los símbolos de depuración con un índice específico llamado com_apple_xcode_dsym_uuids
. Puedes hacer esta búsqueda tú mismo:
mdfind 'com_apple_xcode_dsym_uuids = *'
resp.
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
La primera invocación destacada le brinda todos los paquetes dSYM indexados y la segunda le brinda los .dSYM
paquetes con un UUID específico. Si Spotlight no encuentra su .dSYM
paquete, symbolicatecrash
tampoco lo hará. Si hace todo esto, por ejemplo, en una subcarpeta de su ~/Desktop
foco, debería poder encontrar todo.
Si symbolicatecrash
encuentra su .dSYM
paquete, debería haber una línea como la siguiente en symbolicate.log
:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
Para encontrar su .app
paquete, se invoca una búsqueda destacada como la siguiente symbolicatecrash
:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
Si symbolicatecrash
encuentra su .app
paquete, debería haber el siguiente extracto en symbolicate.log
:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
Si encuentra todos esos recursos, symbolicatecrash
debería imprimir la versión simbólica de su registro de fallos.
De lo contrario, puede pasar sus archivos dSYM y .app directamente.
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
Nota: El rastreo inverso simbolizado se enviará al terminal, no al archivo symbolicate.log
.
Con la última versión de Xcode (3.2.2), puede arrastrar y soltar cualquier informe de fallos en la sección Registros del dispositivo del Organizador Xcode y se simbolizarán automáticamente para usted. Creo que esto funciona mejor si creaste esa versión de la aplicación usando Build & Archive (también parte de Xcode 3.2.2)