Simbolizar los informes de bloqueo de aplicaciones de iPhone

433

Estoy tratando de simbolizar los informes de fallas de mi aplicación para iPhone.

Recuperé los informes de fallos de iTunes Connect. Tengo el archivo 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 que está indexado por Spotlight.

¿Ahora que?

He intentado invocar:

symbolicatecrash crashreport.crash myApp.app.dSYM

y solo muestra el mismo texto que está en el informe de bloqueo para comenzar, no simbolizado.

¿Estoy haciendo algo mal?

Jasarien
fuente
3
También puede ver mi respuesta en el SDK de iPhone: ¿Dónde se encuentra symbolicatecrash.sh? . symbolicatecrashEnumero dónde encontrar el comando, cómo usarlo y cómo encontrar el archivo dSYM necesario para hacer la simbolización.
Sam
66
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash
logancautrell
55
He creado un script que puede ayudar: github.com/amleszk/scripts/blob/master/…
amleszk
1
Si alguien se pregunta dónde puede obtener * .app, * .dSYM y registros de bloqueo, consulte mi respuesta a continuación.
Sam B

Respuestas:

689

Pasos para analizar el informe de bloqueo de apple:

  1. 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 bloqueo recibido de APPLE en una CARPETA .

  2. ABRA la aplicación de terminal y vaya a la carpeta creada anteriormente (usando el cdcomando)

  3. Ejecutar 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 se bloqueó según el informe.

Ex: atos -arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508

Esto le mostrará la línea exacta, el nombre del método que resultó en un 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 podemos obtener una Carpeta de carga útil que contiene la aplicación. En este caso no necesitamos el archivo .dSYM.

Nota

Esto solo puede funcionar si el binario de la aplicación no tiene símbolos despojados. Por defecto, las versiones de lanzamiento despojaron 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

Naveen Shan
fuente
12
Sólo un consejo a la respuesta @NaveenShan, un ejemplo del mundo real sería hacer esto atos -o myApp.app/Contents/MacOS/myApp 0x0000000100001f2c y conseguir que -[HUDWindow sizedHUDBackground] (in myApp) + 1197
loretoparisi
3
¿Qué dirección usas, sin embargo? Los registros tienen dos columnas de direcciones después de cada función, y la segunda tiene un + y un desplazamiento de algún tipo. Me gusta 0x332da010 0x332d9000 + 4112.
Oscar
77
@OscarGoldman La segunda dirección, por ejemplo: - En 0x332da010 0x332d9000 + 4112. use 0x332d9000.
Naveen Shan
44
Además, si se usa sin una dirección, le permite analizar múltiples ubicaciones al enviarlas una por una.
Paul Ardeleanu
42
Hay varios problemas con esta respuesta: 1. Esto solo puede funcionar si el binario de la aplicación no tiene símbolos eliminados. Y las versiones de lanzamiento por defecto las tienen despojadas. 2. Incluso si los símbolos están disponibles, nunca mostrará el número de línea. Solo la simbolización con el dSYM proporcionará eso. 3. No puede simplemente usar la dirección de memoria que se muestra en el seguimiento de la pila, la dirección debe normalizarse con la dirección de memoria de inicio en la que se carga la aplicación. Más detalles ver esta respuesta: stackoverflow.com/questions/13574933/…
Kerni
173

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:

  1. El archivo de registro de bloqueo en sí (es decir example.crash, exportado desde el organizador de XCode o recibido desde iTunes Connect).
  2. El .apppaquete (es decir example.app) que contiene el binario de la aplicación que pertenece al registro de fallas. Si tiene un .ipapaquete (es decir example.ipa), puede extraer el .apppaquete descomprimiendo el .ipapaquete (es decir unzip example.ipa). Posteriormente, el .apppaquete reside en la Payload/carpeta extraída .
  3. El .dSYMpaquete 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 symbolicatecrashguió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 symbolicatecrashen 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 .dSYMpaquetes con un UUID específico. Si Spotlight no encuentra su .dSYMpaquete symbolicatecrash, tampoco lo hará. Si hace todo esto, por ejemplo, en una subcarpeta de su ~/Desktopfoco, debería poder encontrar todo.

Si symbolicatecrashencuentra su .dSYMpaquete, 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 .apppaquete, 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 symbolicatecrashencuentra su .apppaquete, 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.

Andreas Klöber
fuente
puedo encontrar todos los archivos sin embargo obtengo esto, y no hay salida simbolizadaNo crash report version in testlog.crash at /usr/bin/symbolicatecrash line 921.
jere
1
¡Esto fue realmente útil! En mi caso, el archivo .app tiene un nombre diferente que el nombre del ejecutable (no sé por qué, pero Xcode lo crea de esta manera). Después de cambiar el nombre del archivo .app en el archivo XCode, la simbolización funcionó.
Hrissan
29
Esta es una gran explicación y debería ser la mejor respuesta de la OMI, gracias. Tenga en cuenta que puede que tenga que configurar su DEVELOPER_DIRvariable de entorno si el script se queja de que de este modo: export DEVELOPER_DIR=`xcode-select --print-path` . Agregué esta línea a mi ~/.bash_profile. Ver stackoverflow.com/q/11682789/350761
Eliot
1
Tenga en cuenta que para Xcode 5, esto se ha movido a: <PATH_TO_Xcode.app> /Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/Current/Resources/symbolicatecrash
Eliot
1
El bloqueo simbólico también tiene varias opciones útiles. <SYMBOL_PATH> Additional search paths in which to search for symbol rich binaries -o | --output <OUTPUT_FILE> The symbolicated log will be written to OUTPUT_FILE. Defaults to "-" (i.e. stdout) if not specified -d | --dsym <DSYM_BUNDLE> Adds additional dSYM that will be consulted if and when a binary's UUID matches (may be specified more than once)
benuuu
115

Con la última versión de Xcode (3.2.2), puede arrastrar y soltar los informes de fallas en la sección Registros de dispositivos del Organizador de Xcode y se simbolizarán automáticamente para usted. Creo que esto funciona mejor si compiló esa versión de la aplicación usando Build & Archive (también parte de Xcode 3.2.2)

Alan Rogers
fuente
3
Esto simplemente no funciona con Xcode4, en una instalación nueva. Parece ser un nuevo error :(
Adam
1
No estoy seguro de si esto resuelve el mismo problema que tienes, pero alguien ha parcheado el script simbolizado github.com/nskboy/symbolicatecrash-fix YMMV :)
Alan Rogers
2
Este consejo funciona con Xcode 4.2. Coloque los registros de fallos en los registros del dispositivo del organizador. ¡Reinicie el organizador obtendrá registros de bloqueo simbolizados! Gracias.
harshit2811
2
Esto no funcionó cuando importé un archivo de otra computadora para obtener un registro de fallas. :( Por esta razón, tuve que simbolizar manualmente el archivo. Puede encontrar pasos sobre cómo hacer la simbolización aquí: SDK de iPhone: ¿Dónde se encuentra symbolicatecrash.sh?
Sam
3
No me funciona con los informes de fallos descargados de iTunes Connect.
Dmitry
72

Hice esto con éxito, usando los siguientes pasos.

Paso 1: Cree una carpeta en el escritorio, le doy un nombre a "CrashReport" y pongo tres archivos ("MYApp.app", "MyApp.app.dSYM", "MYApp_2013-07-18.crash").

Paso 2: Abra el Finder y vaya a Aplicaciones, donde encontrará la aplicación Xcode, haga clic derecho sobre esto y haga clic en "Mostrar contenido del paquete", luego siga esta ruta simple. "Contenido-> Desarrollador-> Plataformas-> iPhoneOS.platform-> Desarrollador-> Biblioteca-> PrivateFrameworks-> DTDeviceKit.framework -> Versiones-> A-> Recursos"

O

"Contenido-> Desarrollador-> Plataformas-> iPhoneOS.platform-> Desarrollador-> Biblioteca-> PrivateFrameworks-> DTDeviceKitBase.framework -> Versiones-> A-> Recursos"

O

Para Xcode 6 y superior, la ruta es Aplicaciones / Xcode.app / Contents / SharedFrameworks / DTDeviceKitBase.framework / Versions / A / Resources

Cuando encuentre el archivo "symbolicatecrash", cópielo y péguelo en la carpeta "CrashReport".

Paso 3: inicie la terminal, ejecute estos 3 comandos

  1. cd / Users / mac38 / Desktop / CrashReport y presione el botón Enter

  2. export DEVELOPER_DIR = "/ Applications / Xcode.app / Contents / Developer" y presione Entrar

  3. ./symbolicatecrash -A -v MYApp_2013-07-18.crash MyApp.app.dSYM y presiona Enter Now is Done .. (NOTA: las versiones alrededor de 6.4 o posteriores no tienen la opción -A, solo déjalo fuera).
SachinVsSachin
fuente
3
para buscar DTServiceKit en Aplicaciones / Xcode.app / Contenidos / SharedFrameworks
Ryan Heitner
3
Gracias Gracias ... a partir del 9 de abril de 2015, esto es lo que funcionó para mí sin problemas. Una cosa, es que obtuve el Unknown option: Asímbolo Symbolictecrash, pero el proceso se ejecutó de todos modos
Matt Fiocca, el
1
Desearía poder dar mil puntos a esta respuesta. Hay muchos procedimientos sobre este tema ... pero este es el que funciona en el nivel más bajo, por lo que SIEMPRE funciona. Es un dolor en la parte trasera dar todos los pasos, pero cuando todo lo demás falla, esto hace el trabajo.
Chad Robinson
35

Pasos para simbolizar un informe de bloqueo automáticamente usando XCode:

ACTUALIZADO PARA XCODE 9

  1. Conecte cualquier dispositivo iOS a su Mac (sí, uno físico, sí, sé que esto es estúpido)

  2. Elija "Dispositivos" en el menú "Ventana" ingrese la descripción de la imagen aquí

  3. Haga clic en su dispositivo a la izquierda y VER REGISTRO DE DISPOSITIVOS a la derecha ingrese la descripción de la imagen aquí

  4. Espere. Puede demorar un minuto en aparecer. Tal vez hacerlo Command-Aentonces Deleteacelere esto.

  5. Indocumentado paso fundamental: cambiar el nombre del informe de error que recibió de iTunesConnect de.txtextensión a.crashextensión

  6. Arrastre el informe de bloqueo a esa área a la izquierda ingrese la descripción de la imagen aquí

Y luego Xcode simbolizará el informe del bloqueo y mostrará los resultados.

Fuente: https://developer.apple.com/library/ios/technotes/tn2151/_index.html

William Entriken
fuente
1
Este es el procedimiento oficial de Apple. Debería ser la respuesta.
Giammy
2
Gracias, estoy agregando fotos ahora. También se incluye el paso SUPER INDOCUMENTADO. Pensé en hacer un poco de texto rojo y empalmarlo allí para que realmente se destacara. Entonces dejé de pensar en eso.
William Entriken
1
¡Gracias! Ninguna de las otras respuestas dice realmente que el dispositivo que usa no necesita ser el dispositivo (o incluso el tipo de dispositivo) en el que ocurrió el bloqueo.
galactikuh
Nota rápida, porque para mí no volvería a simbolizar. También tuve que abrir Organizador, hacer clic en la compilación en Archivos, hacer clic en Descargar símbolos de depuración. Entonces podría volver a simbolizar en la vista de registro del dispositivo. Esto fue para un registro de bloqueo descargado de Apple después de una revisión rechazada.
gregthegeek
28

Uso Airbrake en mis aplicaciones, lo que hace un buen trabajo de registro remoto de errores.

Así es como los simbolizo con atos si la traza inversa lo necesita:

  1. En Xcode (4.2) vaya al organizador, haga clic derecho en el archivo desde el que se generó el archivo .ipa.

  2. En Terminal, cd en xcarchive por ejemploMyCoolApp 10-27-11 1.30 PM.xcarchive

  3. Ingrese lo siguiente atos -arch armv7 -o 'MyCoolApp.app'/'MyCoolApp' (no olvide las comillas simples)

  4. No incluyo mi símbolo en esa llamada. Lo que obtienes es un cursor de bloque en una línea vacía.

  5. Luego copio / pego mi código de símbolo en ese cursor de bloque y presiono enter. Verás algo como:

    -[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34)

  6. Regresó a un cursor de bloque y puede pegar otros símbolos.

Poder atravesar un elemento de la traza inversa sin volver a ingresar el primer bit es un buen ahorro de tiempo.

¡Disfrutar!

averydev
fuente
28

También puse dsym, el paquete de aplicaciones y el registro de bloqueos juntos en el mismo directorio antes de ejecutar el bloqueo simbólico

Luego uso esta función definida en mi .profile para simplificar la ejecución de symbolicatecrash:

function desym
{
    /Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more
}

Los argumentos agregados allí pueden ayudarte.

Puede verificar para asegurarse de que Spotlight "ve" sus archivos dism ejecutando el comando:

mdfind 'com_apple_xcode_dsym_uuids = *'

Busque el dsym que tiene en su directorio.

NOTA: a partir de la última versión de Xcode, ya no hay un directorio de desarrolladores. Puedes encontrar esta utilidad aquí:

/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Vers‌ ions / A / Resources / symbolicatecrash

Kendall Helmstetter Gelner
fuente
1
Miré la salida de mdfind, y el archivo dSYM definitivamente se puede ver en primer plano. Sin embargo, el script symbolicatecrash todavía no genera nada diferente del informe de bloqueo en sí. Incluso usando los argumentos que proporcionaste.
Jasarien
El script debe producir un texto de advertencia al principio si no puede encontrar el dsym. ¿Puedes buscar eso y ver lo que dice?
Kendall Helmstetter Gelner el
Además, intente agregar "." después del comando, por lo que sería "symbolicatecrash -A -v MyApp.crashlog". . Eso lo obliga a buscar en el directorio actual si aún no lo está haciendo.
Kendall Helmstetter Gelner el
Significado "No se puede ejecutar" / usr / bin / xcode-select ": No existe tal archivo o directorio en /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneRemoteDevice.xcodeplugin/Contents/Resources/ línea de Symbolicatecrash 49. "
bpapa
Vaya, aparentemente hay otra pregunta SO para esa stackoverflow.com/questions/1859852/…
bpapa
21

Solo una respuesta simple y actualizada para xcode 6.1.1.

PASOS

1.Xcode> Ventana> Dispositivos.

2. Seleccione un dispositivo de una lista de dispositivos en la sección DISPOSITIVOS.

3. Seleccione Ver registros del dispositivo.

4.En la sección Todos los registros, puede arrastrar y soltar directamente el informe.

5.Xcode simbolizará automáticamente el informe de bloqueo por usted.

6.Puede encontrar el informe de bloqueo simbolizado haciendo coincidir su fecha / hora con la fecha / hora mencionada en su informe de bloqueo.

Aditya Aggarwal
fuente
3
Los informes de fallos que he descargado del Centro de resolución de Apple suelen tener la extensión .txt. Recuerde cambiarles el nombre a .crash, de lo contrario, Device Logs puede negarse a agregarlos. Funciona bien para mi XCode 6.3.1 actual
Tony
3
Este es el procedimiento oficial de Apple. Debería ser la respuesta. Enlace de Apple: Nota técnica TN2151: Comprensión y análisis de informes de
bloqueo de
¿Cómo hacemos esto si el bloqueo proviene de Apple / iTunesConnect? En otras palabras, ¿no conocemos o tenemos el dispositivo en el que ocurrió el bloqueo?
galactikuh
14

A pesar de que había estado desarrollando aplicaciones durante algunos años, esta era la primera vez que depuraba un archivo binario y me sentía como un completo NOOB averiguando dónde estaban todos los archivos, es decir, dónde están * .app * .dSYM y los registros de bloqueo. Tuve que leer varias publicaciones para resolverlo. La imagen vale más que mil palabras y espero que esta publicación ayude a cualquier otra persona en el futuro.

1- Primero ve a itunesconnect y descarga tus registros de fallas. NOTA: en la mayoría de los casos, puede obtener algo como "Se han enviado muy pocos informes para que se muestre un informe". Básicamente, no hay suficientes usuarios que hayan enviado informes de registro de fallas a Apple, en cuyo caso no puede hacer mucho en ese momento.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

2- Ahora, si no ha cambiado su código desde que envió su binario a Apple, inicie Xcode para ese proyecto y vuelva a hacer Producto -> Archivar. De lo contrario, solo encuentre su último binario enviado y haga clic derecho sobre él.

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Sam B
fuente
8

En Xcode 4.2.1, abra Organizer , luego vaya a Library / Device Logs y arrastre su archivo .crash a la lista de registros de bloqueo. Se simbolizará para usted después de unos segundos.

Tenga en cuenta que debe usar la misma instancia de Xcode en la que se archivó la compilación original (es decir, el archivo para su compilación debe existir en Organizer ).

cberkley
fuente
8

Con Xcode 4, la tarea es aún más simple:

  • Organizador abierto ,
  • haga clic en Biblioteca | Registro de dispositivo en la columna izquierda
  • haga clic en el botón " Importar " en la parte inferior de la pantalla ...

y voilá. El archivo de registro se importa y simboliza automáticamente para usted. Siempre que haya archivado la compilación utilizando Xcode -> Producto -> Archivar primero.

Sébastien Stormacq
fuente
1
Por extraño que parezca, importar no tiene ningún efecto. Sin embargo, poner .app, .dSYM y .crash y luego ejecutar symbolicatecrash en el archivo .crash (sin ningún argumento adicional) funcionó (XCode 4)
Ruso
7

El mágico Xcode Organizer no es tan mágico para simbolizar mi aplicación. No obtuve ningún símbolo para los informes de fallos que recibí de Apple de un envío fallido de la aplicación.

Intenté usar la línea de comandos, colocando el informe de bloqueo en la misma carpeta que el archivo .app (que envié a la tienda) y el archivo .dSYM:

$ symbolicatecrash "My App_date_blahblah-iPhone.crash" "My App.app"

Esto solo proporcionó símbolos para mi aplicación y no el código básico de la base, pero fue mejor que el volcado de números que Organizer me está dando y fue suficiente para que encontrara y solucionara el bloqueo que tenía mi aplicación. Si alguien sabe cómo extender esto para obtener los símbolos de la Fundación, se lo agradeceríamos.

AndrewS
fuente
Para Core dSYM de Foundation, un chico (puede ser chino) había subido el dSYM en su unidad de Google compartida, simplemente descárguelo y tírelo a la carpeta "dispositivos compatibles" y se resolverá. github.com/Zuikyo/iOS-System-Symbols
harunaga
6

En mi caso, estaba arrastrando informes de fallos directamente desde Mail al Organizador. Por alguna razón, eso evitó que los informes de bloqueo se simbolizaran (me encantaría saber por qué).

Copiar primero los informes de fallos en el Escritorio y luego arrastrarlos desde allí al Organizador los simbolizó correctamente.

Caso muy específico, lo sé. Pero pensé en compartir por si acaso.

samvermette
fuente
Me imagino que esto puede tener algo que ver con los reflectores. ¿Existe alguna posibilidad de que la ubicación donde el organizador guarda sus registros no esté siendo indexada por los reflectores?
Jasarien 05 de
4

Aquí hay otro problema que tengo con symbolicatecrash: no funcionará con aplicaciones que tengan espacios en su paquete (es decir, 'Test App.app'). Tenga en cuenta que no creo que pueda tener espacios en su nombre al enviar, por lo que debe eliminarlos de todos modos, pero si ya tiene bloqueos que deben analizarse, aplique el parche symbolicatecrash (4.3 GM) como tal:

240c240
<         my $cmd = "mdfind \"kMDItemContentType == com.apple.application-bundle && kMDItemFSName == $exec_name.app\"";
---
>         my $cmd = "mdfind \"kMDItemContentType == com.apple.application-bundle && kMDItemFSName == '$exec_name.app'\"";
251c251
<             my $cmd = "find \"$archive_path/Products\" -name $exec_name.app";
---
>             my $cmd = "find \"$archive_path/Products\" -name \"$exec_name.app\"";
Alastair Stuart
fuente
Por lo que vale, llené un radar sobre esto y está arreglado en [redactado]
Alastair Stuart
4

Para aquellos que usan Airbrake, hay una respuesta sólida arriba, pero no funcionaría para mí sin ajustar:

Funciona para algunas direcciones de memoria pero no para otras, no estoy seguro de por qué ...

  • Crea un nuevo directorio en el escritorio o donde sea
  • Encuentra el archivo en cuestión en el organizador Xcode
  • Toca dos veces para revelar en el buscador
  • Toca dos veces para mostrar el contenido del paquete
  • Copie el archivo .dSYM y el archivo .app en un nuevo directorio
  • cd en nuevo directorio
  • Ejecute este comando: atos -arch armv7 -o 'Vimeo.app' / 'Vimeo'
  • Terminal entrará en un movimiento interactivo
  • Pegue la dirección de memoria y presione enter, generará el nombre del método y el número de línea
  • Alternativamente, ingrese este comando: atos -arch armv7 -o 'Vimeo.app' / 'Vimeo' Para obtener información solo para una dirección
Alfie Hanssen
fuente
4

La combinación que funcionó para mí fue:

  1. Copie el archivo dSYM en el directorio donde estaba el informe del bloqueo
  2. Descomprima el archivo ipa que contiene la aplicación ('descomprima MyApp.ipa')
  3. Copie el binario de la aplicación de la carga útil explotada resultante en la misma carpeta que el informe de bloqueo y el archivo de símbolos (algo así como "MyApp.app/MyApp")
  4. Importe o vuelva a simbolizar el informe de bloqueo desde el organizador de Xcode

Utilizando atos , no pude resolver la información de símbolo correcta con las direcciones y las compensaciones que estaban en el informe de bloqueo. Cuando hice esto, veo algo más significativo, y parece ser una traza legítima de la pila.

Sean Aitken
fuente
3

Tuve que hacer un montón de pirateo de la secuencia de comandos Symbolicatecrash para que se ejecute correctamente.

Por lo que puedo decir, symbolicatecrash en este momento requiere que el .app esté en el mismo directorio que el .dsym. Utilizará el .dsym para localizar el .app, pero no utilizará el dsym para encontrar los símbolos.

Debería hacer una copia de su símbolo de bloqueo antes de intentar estos parches que harán que se vea en el dsym:

Alrededor de la línea 212 en la función getSymbolPathFor_dsymUuid

212     my @executablePath = grep { -e && ! -d } glob("$dsymdir" . "/Contents/Resources/DWARF/" . $executable);

Alrededor de la línea 265 en la función matchUUID

265             return 1;
JerryH
fuente
1

Esto es simple, después de buscar mucho, encontré pasos claros para simbolizar todo el archivo de registro de fallas.

  • Copie archivos .app, crash_report y DSYM en una carpeta.
  • conecte el dispositivo con xcode
  • Luego vaya a la ventana -> seleccione dispositivos -> ver registros de dispositivos
  • Luego seleccione este dispositivo, elimine todos los registros.
  • arrastre y suelte su bloqueo en la sección de registro del dispositivo. Simbolizará automáticamente el bloqueo. simplemente haga clic derecho en el informe y expórtelo.

feliz codificación,
Riyaz

Shaik Riyaz
fuente
mejores respuestas cortas y dulces, siga todos y cada uno de los pasos escritos en esta respuesta. developer.apple.com/library/content/technotes/tn2151/… siga este enlace para encontrar la diferencia entre no simbolizado y totalmente simbolizado.
Ninad Kambli
1

Prefiero un script que simbolice todos mis registros de bloqueo.

Condiciones previas

Crea una carpeta y coloca 4 cosas:

  1. symbolicatecrash script perl: hay muchas respuestas SO que indican su ubicación

  2. El archivo de la compilación que coincide con los bloqueos (de Xcode Organizer. Simple como Show in Findery copia) [No estoy seguro de que sea necesario]

  3. Todos los xccrashpointpaquetes: (desde Xcode Organizer. Show in Finder, Puede copiar todos los paquetes en el directorio, o el único punto xccrash que le gustaría simbolizar)

  4. Agregue ese script corto al directorio:

    #!/bin/sh
    
    echo "cleaning old crashes from directory"
    rm -P *.crash
    rm -P *.xccrashpoint
    rm -r allCrashes
    echo "removed!"
    echo ""
    echo "--- START ---"
    echo ""
    
    mkdir allCrashes
    mkdir symboledCrashes
    find `ls -d *.xccrashpoint` -name "*.crash" -print -exec cp {} allCrashes/ \;
    
    cd allCrashes
    for crash in *.crash; do
        ../symbolicatecrash $crash > ../symboledCrashes/V$crash
    done
    cd ..
    
    echo ""
    echo "--- DONE ---"
    echo ""

La secuencia de comandos

Cuando ejecutas el script, obtendrás 2 directorios.

  1. allCrashes- Todos los accidentes de todos los xccrashpointestarán allí.

  2. symboledCrashes - los mismos bloqueos pero ahora con todos los símbolos.

  3. NO necesita limpiar el directorio de bloqueos anteriores antes de ejecutar el script. Se limpiará automáticamente. ¡buena suerte!

Itzjak
fuente
1

Descubrí que la mayoría de las alternativas propuestas no funcionaban en el último XCode (probado con Xcode 10). Por ejemplo, no tuve suerte arrastrando y soltando registros .crash en Xcode -> Organizador -> Registros del dispositivo -view.

Recomiendo usar la herramienta Symbolicator https://github.com/agentsim/Symbolicator

  • Git clone Symbolicator repositorio y compilar y ejecutar con Xcode
  • Copie el archivo .crash (archivo ascii, con el seguimiento de la pila al comienzo del archivo) y .xarchive de la liberación de bloqueo en la misma carpeta temporal
  • Arrastre y suelte el archivo .crash al icono de Symbolicator en el Dock
  • En 5-30 segundos, el archivo de bloqueo simbolizado se produce en la misma carpeta que .crash y .xarchive
Erkki Nokso-Koivisto
fuente
0

Para simbolizar bloqueos, Spotlight debe poder encontrar el archivo .dSYM que se generó al mismo tiempo que el binario que envió a Apple. Como contiene la información del símbolo, no tendrá suerte si no está disponible.

rpetrich
fuente
Si leyó la pregunta, le dije que había guardado el archivo dSYM original que se generó al mismo tiempo que se envió el binario.
Jasarien
0

Me enojé un poco por el hecho de que nada aquí parece "simplemente funcionar", así que investigué un poco y el resultado es:

Configurar: QuincyKit back-end que recibe informes. No se configuró ninguna simbolización, ya que ni siquiera podía comenzar a entender qué sugerían que hiciera para que funcionara.

La solución: descargue los informes de fallos del servidor en línea. Se llaman 'crash' y por defecto van a la carpeta ~ / Downloads /. Con eso en mente, este script "hará lo correcto" y los informes de fallas irán a Xcode (Organizador, registros del dispositivo) y se realizará la simbolización.

La secuencia de comandos:

#!/bin/bash
# Copy crash reports so that they appear in device logs in Organizer in Xcode

if [ ! -e ~/Downloads/crash ]; then 
   echo "Download a crash report and save it as $HOME/Downloads/crash before running this script."
   exit 1
fi

cd ~/Library/Logs/CrashReporter/MobileDevice/
mkdir -p actx # add crash report to xcode abbreviated
cd actx

datestr=`date "+%Y-%m-%d-%H%M%S"`

mv ~/Downloads/crash "actx-app_"$datestr"_actx.crash"

Las cosas se pueden automatizar a donde puede arrastrar y soltar en Xcode Organizer haciendo dos cosas si usa QuincyKit / PLCR.

En primer lugar, debe editar el script remoto admin / actionapi.php ~ línea 202. Parece que no tiene la marca de tiempo correcta, por lo que el archivo termina con el nombre 'crash' que Xcode no reconoce (quiere algo punto crash):

header('Content-Disposition: attachment; filename="crash'.$timestamp.'.crash"');

En segundo lugar, en el lado de iOS en QuincyKit BWCrashReportTextFormatter.m ~ línea 176, cambie @"[TODO]"a @"TODO"para evitar los caracteres malos.

Kalle
fuente
0

atos está en desuso, por lo que si está ejecutando OSX 10.9 o posterior, es posible que deba ejecutar

xcrun atos

Advertencia: / usr / bin / atos se está moviendo y se eliminará de una versión futura de OS X. Ahora está disponible en las herramientas de desarrollo de Xcode para invocarlo a través de:xcrun atos


fuente
Parece que Apple está permitiendo que el formato DWARF se transforme con cada lanzamiento de las herramientas (tiene sentido, especialmente con el advenimiento de Swift), por lo que lo están moviendo a la distribución de herramientas.
David Gish
0

Me gusta usar Textwrangler para detectar errores en el rechazo binario de carga de una aplicación original. (Los datos del bloqueo se encontrarán en su cuenta de itunesConnect). Utilizando el método anterior de Sachin, copié el original.crash en TextWrangler, luego copié el archivo symbolicatecrash que he creado en otro archivo TextWrangler. La comparación de los dos archivos señala las diferencias. El archivo Symbolicatecrash tendrá diferencias que señalan el número de problemas del archivo y la línea.

Hombre Montaña
fuente
-2

Utilizamos Google Crashlytics para supervisar los registros de fallas, la sensación es muy oportuna y conveniente de usar.

Enlaces de documentos: https://docs.fabric.io/apple/crashlytics/missing-dsyms.html#missing-dsyms

Todo sobre Missing dSYMs Fabric incluye una herramienta para cargar automáticamente el dSYM de su proyecto. La herramienta se ejecuta a través de la secuencia de comandos / run, que se agrega a la fase de creación de la secuencia de comandos de ejecución durante el proceso de incorporación. Sin embargo, puede haber ciertas situaciones en las que las cargas de dSYM fallan debido a configuraciones de proyecto únicas o si está utilizando Bitcode en su aplicación. Cuando falla una carga, Crashlytics no puede simbolizar y mostrar bloqueos, y aparecerá una alerta de "Falta dSYM" en el panel de control de Fabric.

Los dSYM que faltan se pueden cargar manualmente siguiendo los pasos que se detallan a continuación.

Nota: Como alternativa a la herramienta de carga automática dSYM, Fabric proporciona una herramienta de línea de comandos (símbolos de carga) que puede configurarse manualmente para ejecutarse como parte del proceso de construcción de su proyecto. Consulte la sección de símbolos de carga a continuación para obtener instrucciones de configuración.

...

Tim
fuente