¿Cómo simbolizar el registro de fallos Xcode?

190

El organizador de Xcode 5 tenía una vista que enumeraría todos los registros de bloqueo. y podríamos arrastrar los registros de caída de caída aquí. Pero desde Xcode 6, sé que han movido los dispositivos fuera de la organización y tienen una nueva ventana para lo mismo. Pero no encuentro un lugar donde vea los registros de bloqueo que arrastre y suelte en Xcode 5 después de subir a Xcode 6. ¿Alguien sabe la respuesta?

Nithin Pai
fuente
3
Lo pregunté hace meses en los foros de desarrolladores de Apple y nunca obtuve una respuesta. Esta es una pérdida de funcionalidad útil. Presente un informe de error con Apple pidiéndole que recupere esta función.
rmaddy
1
Reuní esto durante un fin de semana para resolver la simbolización de los volcados de memoria de iOS y OSX. Todavía es muy difícil, pero debería funcionar. github.com/agentsim/Symbolicator
Tim
44
Xcode, ¿puedes por favor simplemente simular los registros de fallas de los revisores de Apple como se supone que debes ... en lugar de asumir que literalmente tenemos todo el día para descubrir cómo hacer esto?
William Entriken

Respuestas:

120

Ok, me di cuenta de que puedes hacer esto:

  1. En Xcode > Window > Devices, seleccione un iPhone / iPad / etc conectado arriba a la izquierda.
  2. Ver registros de dispositivos
  3. Todos los registros

Probablemente tenga muchos registros allí, y para que le resulte más fácil encontrar su registro importado más adelante, puede continuar y eliminar todos los registros en este punto ... a menos que signifiquen dinero para usted. O, a menos que sepa el momento exacto en que ocurrió el bloqueo, de todos modos debería estar escrito en el archivo ... Soy perezoso, así que simplemente elimino todos los registros antiguos (esto realmente tomó un tiempo).

  1. Simplemente arrastre y suelte su archivo en esa lista. Funcionó para mi.
Jonny
fuente
13
Tengo el mismo problema, pero esto no me resuelve el problema: los registros que arrastro y suelto en la ventana aparecen, pero no simbolizan.
Arkaaito
9
El truco es que debe conectar un dispositivo y seleccionar el dispositivo de la lista. No creo que sea posible sin un dispositivo.
Jonny
61
Para que su archivo de bloqueo se pueda arrastrar a esa lista, debe tener la extensión .crash.
pjay_
77
El paso que faltaba para mí fue que una vez que se soltó el archivo, necesitaba hacer clic con el botón derecho del mouse en el archivo y volver a
simbolizar el
66
No olvides "Descargar dSYMs" para ese archivo dentro del Organizador.
123FLO321
259

Escribir esta respuesta tanto para la comunidad como para mí.

Si alguna vez hay problemas que simbolizan un informe de bloqueo, uno puede superarlos de la siguiente manera:

  1. Cree una carpeta separada, copie Foo.appy Foo.app.dSYMdesde la correspondiente .xcarchiveen la carpeta. Copie también el .crashinforme en la carpeta.

  2. Abra el informe de bloqueo en TextEdit o en otro lugar, vaya a la Binary Images:sección y copie la primera dirección allí (por ejemplo 0xd7000).

  3. cden la carpeta Ahora puede ejecutar el siguiente comando:

    xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 0x0033f9bb

Esto simbolizará el símbolo en la dirección 0x0033f9bb. Asegúrese de elegir el valor correcto para la -archopción (puede obtenerse de la primera línea de la Binary Images:sección o deducirse del Hardware Model:informe de bloqueo y de los archivos soportados de la aplicación).

También puede copiar las direcciones necesarias (por ejemplo, una pila de llamadas de subprocesos) desde el informe de bloqueo directamente en un archivo de texto (en TextEdit, mantenga presionada Opción y seleccione el bloque de texto necesario, o copie y corte), para obtener algo como esto:

0x000f12fb
0x002726b7
0x0026d415
0x001f933b
0x001f86d3

Ahora puede guardar esto en un archivo de texto, por ejemplo addr.txt, y ejecutar el siguiente comando:

xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 -f addr.txt

Esto dará una buena simbolización para todas las direcciones a la vez.

PD

Antes de hacer lo anterior, vale la pena verificar que todo esté configurado correctamente (ya atosque felizmente informará algo para básicamente cualquier dirección suministrada).

Para hacer la comprobación, abra el informe de bloqueo y vaya al final de la pila de llamadas para Thread 0. La primera línea desde el final para enumerar su aplicación (generalmente la segunda), por ejemplo:

34  Foo                    0x0033f9bb 0xd7000 + 2525627

Debería ser la main()llamada. Simbolizar la dirección ( 0x0033f9bben este caso) como se describió anteriormente debería confirmar que esto es realmente main()y no algún método o función aleatorio.

Si la dirección no es la de main(), verifique su dirección de carga ( -lopción) y arch ( -archopción).

PPS

Si lo anterior no funciona debido al código de bits , descargue el dSYM para su compilación de iTunes Connect, extraiga el binario ejecutable del dSYM (Finder> Mostrar contenido del paquete), cópielo en el directorio y úselo (es decir Foo) como argumento para atos, en lugar de la Foo.app/Foo.

Costa del mar del Tíbet
fuente
2
gracias por la molestia de escribir el mini tutorial xcrun y actualizarlo con la sección de verificación de cordura. mi cordura se salva después de muchas palabrotas y ningún símbolo a la vista
Anton Tropashko
10
No olvide validar que el informe de bloqueo coincide con el ejecutable y dSYM. Puede verificar esto haciendo coincidir el identificador en los <> 's en la sección Imagen binaria con el que devuelve su archivo ejecutable ejecutandoxcrun dwarfdump --uuid <path to executable>
Ryan C. Payne
2
Es importante tener en cuenta que solo aparecerán los símbolos de su aplicación (Foo). No aparecerá para símbolos de bibliotecas / marcos externos, como Foundation, o libsystem_kernel.dylib.
jlukanta
1
Esto es útil, pero aún no funciona para mí. La parte con la que tengo problemas es que no tengo la información 0xd7000. mi línea se ve así 0x100038328 __mh_execute_header + 99112. He leído qué es __mh_execute_header pero ¿cómo puedo obtener información sobre 0x100038328 ??? tengo todo lo demás
skinsfan00atg
55
Escribí un script bash simple que hace la mayor parte del trabajo por ti. Uso: ./symbolicate.sh mycrash.crash MyApp.app arch64 output.crash solo simbolizará el informe de bloqueo completo y le dará la versión simbolizada del mismo. gist.github.com/nathan-fiscaletti/…
Nathan F.
187

También puede referirse a este, he escrito paso a paso el procedimiento de re-simbolización de bloqueo manual.

Re-simbolización de bloqueo

PASO 1

Mueva todos los archivos anteriores (MyApp.app, MyApp-dSYM.dSYM y MyApp-Crash-log.crash) a una Carpeta con un nombre conveniente donde sea que pueda ir usando Terminal fácilmente.

Para mí, Desktop es el lugar más accesible;) Por lo tanto, he movido estos tres archivos a una carpeta MyApp en Desktop.

PASO 2

Ahora es su turno de Finder, vaya a la ruta de seguir lo que sea aplicable para su versión XCODE.

Use este comando para encontrar el symbolicatecrasharchivo de script,
find /Applications/Xcode.app -name symbolicatecrash

Xcode 8, Xcode 9, Xcode 11 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

Xcode 7.3 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

XCode 7 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

Xcode 6 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Inferior a Xcode 6 Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

O Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

PASO 3

Agregue el directorio del archivo de script symbolicatecrash encontrado a una $PATHvariable de entorno como esta: sudo vim /etc/paths.d/Xcode-symbolicatecrashy pegue el directorio del archivo de script y guarde el archivo. Al abrir una nueva terminal, puede llamar symbolicatecrasha cualquier carpeta como comandos ubicados en /usr/bin.

O

Copie el archivo Symbolicatecrash de esta ubicación y péguelo en el Escritorio / MyApp (Espere ... No me siga ciegamente, estoy pegando el archivo Sybolicatecrash en la carpeta MyApp, uno que creó en el paso uno en su ubicación favorita, que tiene tres archivos. )

PASO 4

Abra Terminal y CD en la carpeta MyApp.

cd Desktop/MyApp — Press Enter
export DEVELOPER_DIR=$(xcode-select --print-path)

 -  Presione Entrar

./symbolicatecrash -v MyApp-Crash-log.crash MyApp.dSYM

 -  Presione Entrar

Eso es !! Los registros simbolizados están en su terminal ... ¿ahora qué está esperando? Ahora simplemente, descubra el error y resuélvalo;)

Feliz codificación !!!

Mrug
fuente
2
@ EmilVikström: Gracias por su sugerencia, he actualizado la respuesta.
Mrug
2
Use export DEVELOPER_DIR =xcode-select --print-path
Parag Bafna
8
Trabajó un placer, gracias. Solo una cosa que tuve que usar export DEVELOPER_DIR = / Applications / XCode.app / Contents / Developer (sin las comillas).
goelectric
1
"export DEVELOPER_DIR = xcode-select --print-path" solo me dice "-bash: export:` --print-path ': no ​​es un identificador válido
Almo
2
actualizar; aquí está ; para xcode7 encuentre symbolicatecrash aquí; /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash por stackoverflow.com/questions / 32804611 / ...
AnneTheAgile
28

Para mí, el archivo .crash fue suficiente. Sin archivo .dSYM y archivo .app.

Ejecuté estos dos comandos en la Mac donde construí el archivo y funcionó:

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash  /yourPath/crash1.crash > /yourPath/crash1_symbolicated.crash
Marek Manduch
fuente
Guau. ¡No sé cómo funciona esto sin el archivo .dsym pero funciona!
rustyMagnet
44
@rustyMagnet La forma en que funciona es mediante el uso de dsyms de las compilaciones archivadas en su computadora.
Andrey Tarantsov
1
Sí, esto solo funciona para las compilaciones que has archivado con Xcode, no para otras compilaciones que puedas haber generado para ejecuciones ad-hoc para las que luego quieras simbolizar los registros de bloqueo.
CMash
21

Hay una manera más fácil de usar Xcode (sin usar herramientas de línea de comandos y buscar direcciones de una en una)

  1. Tome cualquier archivo .xcarchive. Si tiene uno de antes, puede usarlo. Si no tiene uno, cree uno ejecutando Producto> Archivar desde Xcode.

  2. Haga clic derecho en el archivo .xcarchive y seleccione 'Mostrar contenido del paquete'

  3. Copie el archivo dsym (de la versión de la aplicación que se bloqueó) a la carpeta dSYMs

  4. Copie el archivo .app (de la versión de la aplicación que se bloqueó) a la carpeta Productos> Aplicaciones

  5. Edite Info.plist y edite CFBundleShortVersionString y CFBundleVersion en el diccionario ApplicationProperties. Esto te ayudará a identificar el archivo más tarde

  6. Haga doble clic en el archivo .xcarchive para importarlo a Xcode. Debería abrir Organizador.

  7. Regrese al registro de fallas (en la ventana Dispositivos en Xcode)

  8. Arrastre su archivo .crash allí (si aún no está presente)

  9. Todo el registro de bloqueo ahora debe estar simbolizado. De lo contrario, haga clic derecho y seleccione 'Volver a simbolizar el registro de fallas'

RPM
fuente
1
Su respuesta es correcta y simple. No hay necesidad de usar la aplicación Terminal. La recreación de la carpeta .xcarchive es muy importante, ya que no hay un archivo .xcarchive en algún sistema de Integración Continua, en lugar del archivo zip de la carpeta .app.dSYM. Por coincidencia, lo que hice ayer es exactamente lo mismo que dijiste.
DawnSong
¿Cómo debería ser la salida completa?
noobsmcgoobs
Esto simboliza parcialmente mis registros de bloqueo, aunque omití el paso 3-5 ya que mi xcarchive es para la versión de la aplicación que se bloqueó.
Declan McKenna
1
Por supuesto, solo simbolizará su propio código, no el código de la biblioteca externa que puede haber utilizado.
RPM
7

Siga estos pasos en Xcode 10 para simbolizar un registro de bloqueo de una compilación de aplicación en la misma máquina:

  1. Dentro del Organizador , ubique el archivo en el que se basa la aplicación.
  2. Haga clic en el botón Descargar símbolos de depuración . Nada aparecerá en su carpeta de Descargas, pero está bien.
  3. Conecte la máquina de compilación a un dispositivo iOS.
  4. Seleccione el dispositivo en Dispositivos y simuladores .
  5. Haga clic en el botón Ver registros de dispositivos .
  6. Arrastre y suelte el archivo de bloqueo en el panel izquierdo. El archivo debe terminar con una extensión .crash , de lo contrario, el arrastre falla.
  7. Cambie a la pestaña Todos los registros .
  8. Seleccione el archivo de bloqueo agregado.
  9. El archivo debe simbolizarse automáticamente; de ​​lo contrario, utilice el elemento del menú contextual del botón derecho Re-Symbolicate Log .
Ely
fuente
1
Al principio no pensé que esto estuviera agregando nada a otras publicaciones, pero los dos primeros pasos, específicamente los 'Descargar símbolos de depuración', parecen ser lo que me faltaba. Gracias.
Christopher King
6

Si tiene el .dSYM y el archivo .crash en la misma subcarpeta, estos son los pasos que puede seguir:

  1. Mirando la traza inversa en el archivo .crash, observe el nombre de la imagen binaria en la segunda columna y la dirección en la tercera columna (por ejemplo, 0x00000001000effdc en el ejemplo a continuación).
  2. Justo debajo de la traza inversa, en la sección "Imágenes binarias", observe el nombre de la imagen, la arquitectura (por ejemplo, arm64) y la dirección de carga (0x1000e4000 en el ejemplo a continuación) de la imagen binaria (por ejemplo, TheElements).
  3. Ejecute lo siguiente:

$ atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc -[AtomicElementViewController myTransitionDidStop:finished:context:]

Fuente autorizada : https://developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATE_WITH_ATOS

Victor Bogdan
fuente
4

Xcode 11.2.1, diciembre de 2019

Apple le ofrece un registro de bloqueo en formato .txt, que no está simbolizado

** **

Con el dispositivo conectado

** **

  • Descargue el archivo ".txt", cambie la extensión a ".crash" ingrese la descripción de la imagen aquí
    • Abra dispositivos y simuladores desde la pestaña de la ventana en Xcode
    • seleccionar dispositivo y seleccionar registros de dispositivo
    • arrastre y suelte el archivo .crash en la ventana de registro del dispositivo

ingrese la descripción de la imagen aquí

Podremos ver registros de bloqueo simbolizados allí

Consulte el enlace para obtener más detalles sobre los registros de bloqueo de simbolización

Suraj K Thomas
fuente
Guau. El cambio de la extensión de archivo de .txt a .crash lo hizo. Me dieron un archivo .txt. Gracias hombre. No puedo creer que tu respuesta sea tan baja.
datWooWoo
3

Asegúrese de que el nombre de su aplicación Xcode no contenga espacios. Esta fue la razón por la que no funcionó para mí. Entonces /Applications/Xcode.appfunciona, mientras /Applications/Xcode 6.1.1.appque no funciona.

Bouke
fuente
¿Has probado? Si no, intente ver si su comentario tiene sentido.
Bouke
1
Ese no es el mismo problema del que estoy hablando. Se puede cambiar el nombre de Xcode después de la instalación, pero antes del primer uso. Sin embargo, el script para la simbolización no puede manejar espacios en el nombre de la aplicación y fallará.
Bouke
1
@ChuckKrutsinger ¿Realmente lo has intentado? Debido a que los espacios escapados le permitirán ejecutar el script, pero el script en sí fallará. El script probablemente no llama a otros scripts con el espacio escapado.
Bouke
1
@ChuckKrutsinger Eso es muy agradable y todo, pero si uno quiere que Xcode simbolice automáticamente el registro de fallas, necesitará mi respuesta al final.
Bouke
1
Me gustaría reiterar que bouke es correcto y que si tiene un espacio en el camino para la aplicación Xcode, el script que Xcode usa para volver a simbolizar los registros de bloqueo NO funcionará. Nada que ver con la re-simbolización manual.
Gary Makin
2

De los documentos de Apple:

Simbolizar informes de bloqueo con Xcode Xcode intentará automáticamente simbolizar todos los informes de bloqueo que encuentre. Todo lo que necesita hacer para la simbolización es agregar el informe de bloqueo al Organizador Xcode.

  • Conecta un dispositivo iOS a tu Mac
  • Elija "Dispositivos" en el menú "Ventana"
  • En la sección "DISPOSITIVOS" en la columna izquierda, elija un dispositivo
  • Haga clic en el botón "Ver registros de dispositivos" en la sección "Información del dispositivo" en el panel derecho
  • Arrastre su informe de bloqueo a la columna izquierda del panel presentado
  • Xcode simbolizará automáticamente el informe de bloqueo y mostrará los resultados Para simbolizar un informe de bloqueo, Xcode debe poder localizar lo siguiente:

    1. El archivo binario y dSYM de la aplicación que falla.

    2. Los archivos binarios y dSYM para todos los marcos personalizados con los que se vincula la aplicación. Para los marcos que se crearon desde el origen con la aplicación, sus archivos dSYM se copian en el archivo junto con el archivo dSYM de la aplicación. Para los marcos creados por un tercero, deberá solicitar al autor el archivo dSYM.

    3. Símbolos para el sistema operativo en el que la aplicación se estaba ejecutando cuando se bloqueó. Estos símbolos contienen información de depuración para los marcos incluidos en una versión específica del sistema operativo (por ejemplo, iOS 9.3.3). Los símbolos del sistema operativo son específicos de la arquitectura: una versión de iOS para dispositivos de 64 bits no incluirá símbolos armv7. Xcode copiará automáticamente los símbolos del sistema operativo de cada dispositivo que conecte a su Mac.

Si falta alguno de estos, Xcode puede no ser capaz de simbolizar el informe de bloqueo, o solo puede simbolizar parcialmente el informe de bloqueo.

Ethan
fuente
2

El proceso más fácil para simbolizar registros de fallas:

  1. preservar el archivo xcarchive del organizador durante el proceso de creación de IPA para uso futuro.
  2. Cuando se produce el bloqueo, recopile los registros de bloqueo del dispositivo afectado. La extensión debe ser .crash. Si el registro de bloqueo está en formato .ips, simplemente cámbiele el nombre a .crash.
  3. Haga doble clic en xcarchive desde la ruta almacenada para que aparezca en el organizador (si no está presente).
  4. abrir en la ventana xcode-> dispositivos y simuladores -> ver registros de dispositivos -> todos los registros -> arrastrar y soltar el archivo .crash.

Espera 5 segundos. ¡Explosión! ¡las llamadas de la aplicación en el seguimiento de la pila se simbolizarán! Sin embargo, es posible que aún veas muchos símbolos. esas son llamadas internas de la biblioteca y el marco.

¡Este es el más fácil, probado y probado!

Sanchita
fuente
2

Apple le ofrece un registro de bloqueo en formato .txt, que no está simbolizado

** **

Con el dispositivo conectado

** **

  • Descargue el archivo ".txt", cambie la extensión a ".crash" ingrese la descripción de la imagen aquí
    • Abra dispositivos y simuladores desde la pestaña de la ventana en Xcode
    • seleccionar dispositivo y seleccionar registros de dispositivo
    • arrastre y suelte el archivo .crash en la ventana de registro del dispositivo

ingrese la descripción de la imagen aquí

Podremos ver registros de bloqueo simbolizados allí

Consulte el enlace para obtener más detalles sobre los registros de bloqueo de simbolización

Suraj K Thomas
fuente