Después de leer todas estas respuestas aquí para simbolizar un registro de bloqueo (y finalmente tener éxito), creo que faltan algunos puntos aquí que son realmente importantes para determinar por qué la invocación de symbolicatecrash no produce una salida simbolizada.
Hay 3 activos que tienen que encajar cuando simbolizan un registro de bloqueo:
- El archivo de registro de bloqueo en sí (es decir
example.crash
, exportado desde el organizador de XCode o recibido desde iTunes Connect).
- El
.app
paquete (es decir example.app
) que contiene el binario de la aplicación que pertenece al registro de fallas. Si tiene un .ipa
paquete (es decir example.ipa
), puede extraer el .app
paquete descomprimiendo el .ipa
paquete (es decir unzip example.ipa
). Posteriormente, el .app
paquete reside en la Payload/
carpeta extraída .
- El
.dSYM
paquete que contiene los símbolos de depuración (es decir example.app.dSYM
)
Antes de comenzar la simbolización, debe verificar si todos esos artefactos coinciden, lo que significa que el registro de bloqueo pertenece al binario que tiene y que los símbolos de depuración son los que se producen durante la construcción de ese binario.
Cada binario se refiere por un UUID que se puede ver en el archivo de registro de bloqueo:
...
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 fallas pertenece a una imagen binaria de la aplicación llamada example.app/example con UUID aa5e633efda8346cab92b01320043dc3
.
Puede verificar el UUID del paquete binario que tiene con dwarfdump:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
Luego, debe verificar si los símbolos de depuración que tiene 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 se unen y debería poder simbolizar su stacktrace.
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 un find . -name symbolicatecrash
en su directorio Xcode.app para encontrarlo.
Como puede ver, no hay más parámetros dados. Entonces, el script tiene que 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 indexados de dSYM 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, debe 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
, debe imprimir la versión simbolizada de su registro de fallas.
Si no, 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: La traza inversa simbolizada se enviará a la terminal, no symbolicate.log
.
symbolicatecrash
Enumero dónde encontrar el comando, cómo usarlo y cómo encontrar el archivo dSYM necesario para hacer la simbolización.