¿Por qué mis informes de fallas no están simbolizados?

Estoy usando Xcode 4.3.1. El bloqueo ocurrió en mi dispositivo, así que lo conecto y abro Organizador, voy a los registros de mi dispositivo, busco el informe de bloqueo y esto es lo que dice:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x3514488f __exceptionPreprocess + 163
1   libobjc.A.dylib                 0x3656b259 objc_exception_throw + 33
2   CoreFoundation                  0x35144789 +[NSException raise:format:] + 1
3   CoreFoundation                  0x351447ab +[NSException raise:format:] + 35
4   CoreFoundation                  0x350b168b -[__NSCFDictionary setObject:forKey:] + 235
5   myapp                           0x0015b4a7 0xe8000 + 472231
6   myapp                           0x0018add1 0xe8000 + 667089
7   myapp                           0x0013cd5b 0xe8000 + 347483
8   Foundation                      0x30ffb60d __NSFireTimer + 145
9   CoreFoundation                  0x35118a33 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 15
10  CoreFoundation                  0x35118699 __CFRunLoopDoTimer + 365
11  CoreFoundation                  0x3511726f __CFRunLoopRun + 1207
12  CoreFoundation                  0x3509a4a5 CFRunLoopRunSpecific + 301
13  CoreFoundation                  0x3509a36d CFRunLoopRunInMode + 105
14  GraphicsServices                0x36396439 GSEventRunModal + 137
15  UIKit                           0x32190e7d UIApplicationMain + 1081
16  myapp                           0x000f6aff 0xe8000 + 60159
17  myapp                           0x000e9370 0xe8000 + 4976


Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x34f3832c __pthread_kill + 8
1   libsystem_c.dylib               0x36e34208 pthread_kill + 48
2   libsystem_c.dylib               0x36e2d298 abort + 88
3   libc++abi.dylib                 0x30af9f64 abort_message + 40
4   libc++abi.dylib                 0x30af7346 _ZL17default_terminatev + 18
5   libobjc.A.dylib                 0x3656b350 _objc_terminate + 140
6   libc++abi.dylib                 0x30af73be _ZL19safe_handler_callerPFvvE + 70
7   libc++abi.dylib                 0x30af744a std::terminate() + 14
8   libc++abi.dylib                 0x30af881e __cxa_rethrow + 82
9   libobjc.A.dylib                 0x3656b2a2 objc_exception_rethrow + 6
10  CoreFoundation                  0x3509a506 CFRunLoopRunSpecific + 398
11  CoreFoundation                  0x3509a366 CFRunLoopRunInMode + 98
12  GraphicsServices                0x36396432 GSEventRunModal + 130
13  UIKit                           0x32190e76 UIApplicationMain + 1074
14  myapp                           0x000f6af8 0xe8000 + 60152
15  myapp                           0x000e9368 0xe8000 + 4968

¿Pensé que Xcode maneja la simbolización de los informes de fallas para mí automáticamente? ¿Por qué no recibo ningún número de línea o método? ¿Y por qué mis códigos de excepción son 0x00000000?

Lo intenté el método encontrado aquí, pero cuando escribo cualquiera de las direcciones de memoria, el resultado es la misma dirección de memoria. ¿Es esta la mayor cantidad de información que puedo obtener de los registros de fallas o hay algo mal aquí?

preguntado el 22 de mayo de 12 a las 18:05

¿Ha intentado ejecutar el informe de bloqueo a través de atos? -

Sí, probé el método que se encuentra en el enlace de arriba, que es el método atos, pero cualquiera que sea la dirección de memoria que escriba después atos -arch armv7 -o 'myapp.app'/'myapp' MEMORY ADDRESS, solo cierra la sesión de lo que escriba para la dirección de memoria, por lo que la salida aquí sería DIRECCIÓN DE MEMORIA -

Otra cosa: el último bloqueo ocurrió esta mañana, y cambié un par de líneas de código (cosas de la interfaz) y lo construí. No suelo archivar ni nada, solo construyo. Entonces, el registro de fallas que tengo es de una compilación anterior (aunque no ha cambiado mucho). Si no uso la opción de archivo, ¿podría ser esta la razón? -

Sí, por eso. La simbolización solo funciona para una compilación específica. Ni siquiera puedes reconstruir exactamente el mismo código fuente. -

Yo también tengo el mismo problema. @maq, ¿Encontraste alguna solución? -

5 Respuestas

Para simbolizar el informe de bloqueo, necesita el paquete dSYM de esa compilación exacta. Supongo que esta fue una compilación de depuración que no se archivó, por lo que el dSYM también se sobrescribió la próxima vez que compilaste la aplicación. Esta es la razón por la que el organizador no pudo simbolizar completamente el informe del accidente.

El método que mencionó solo funciona si el binario no tiene símbolos eliminados, ¡e incluso entonces no informaría los números de línea! Entonces, en lugar de usarlo contra el binario de la aplicación, utilícelo con el dSYM. Tal vez tenga suerte y el nuevo dSYM todavía tenga información útil.

atos -arch armv7 -o 'appname.app.dSYM' 0x0015b4a7

El bloqueo en sí podría estar configurando un valor NSDictionary, por ejemplo, una clave nula.

contestado el 22 de mayo de 12 a las 19:05

Afortunadamente, con la versión 4.3.2 Xcode para mí, los registros están simbolizados con los números de línea y sin el archivo de compilación actual mientras se tiene el Strip Debug Symbols During Copy establecido en NO para las configuraciones de depuración. - Viva

Entonces, el dSYM todavía está disponible en su Mac. El script de simbolización lo busca usando Spotlight. Los símbolos que forman parte del ejecutable no proporcionan números de línea. Nunca. - Kerni

No he sido capaz de hacer que esto funcione. El nombre de mi aplicación tiene un espacio y un apóstrofo. No estoy seguro de por qué Apple permitió que se enviara de esa manera (o por qué no lo pensé mejor), pero no puedo acceder a ninguno de los símbolos de depuración para mi código propio. Los de Apple (Core Data, UIKit, etc.) funcionan bien. - SAHM

Con la esperanza de que esto pueda ayudar a alguien más con el mismo problema, lo que funcionó para mí fue ejecutar el siguiente comando en el directorio de archivo (parece /Users/my_user/Library/Developer/Xcode/Archives/2012-09-24, entonces cd allí primero)

mdimport .

Intente ejecutar el script simbólicotecrash después de eso. En XCode, vaya a su Organizador, Registros de dispositivos y seleccione "Re-Simbolizar registro" haciendo clic con el botón derecho en el registro de fallas.

Respondido el 17 de diciembre de 12 a las 21:12

Esto funcionó perfectamente para una aplicación que tengo en el mercado. ¡Brillante! ¿Qué te llevó a encontrar esto? - paiego

¡A mi también me sirvió! ¡Gracias! - Penades M

No pude hacer que XCode 4.5.1 simbolizara arrastrando el informe de bloqueo a Organizador->Dispositivos->Biblioteca->Registros de dispositivos.

Tampoco pude obtener la dirección simbolizada del accidente especificando el dSYM según la publicación anterior de @Kerni.

He utilizado atos, pero solo pude hacerlo funcionar especificando la ruta completa del archivo de símbolos dentro del xcarchive archivo (en realidad es un directorio). Ejemplo:

cd dir_where_the_xcarchive_is
atos -arch armv7 -o myApp\ 9-18-12\ 5.28\ PM.xcarchive/dSYMs/myApp.app.dSYM/Contents/Resources/DWARF/myApp   0x0001943a

Respondido 22 Oct 12, 22:10

Con respecto a su pregunta sobre los códigos de excepción...

Exception Codes: 0x00000000, 0x00000000

... esta nota técnica de Apple Podría responder a su pregunta. En resumen, este informe de bloqueo no fue generado por un tipo de bloqueo estándar documentado.

Unas 16 líneas en el registro de fallas, verá una línea que comienza con el texto seguido de uno o más valores hexadecimales, que son códigos específicos del procesador que pueden brindarle más información sobre la naturaleza de la falla. A partir de estos códigos, puede saber si la aplicación se bloqueó debido a un error de programación (por ejemplo, un acceso incorrecto a la memoria, una excepción, etc.) o si la aplicación finalizó por algún otro motivo, por ejemplo:

El código de excepción 0x8badf00d indica que iOS finalizó una aplicación porque se agotó el tiempo de espera del mecanismo de vigilancia. La aplicación tardó demasiado en iniciarse, finalizar o responder a los eventos del sistema. Una causa común de esto es hacer redes sincrónicas en el subproceso principal. El código de excepción 0xmalo22222 indica que iOS finalizó una aplicación de VoIP porque se reanudó con demasiada frecuencia. El código de excepción 0xmuerto10cc indica que iOS finalizó una aplicación porque retuvo un recurso del sistema (como la base de datos de la libreta de direcciones) mientras se ejecutaba en segundo plano. El código de excepción 0xmuertofa11 indicó que el usuario ha forzado el cierre de una aplicación. Los cierres forzados ocurren cuando el usuario primero mantiene presionado el botón de encendido/apagado hasta que aparece "deslizar para apagar", luego mantiene presionado el botón de inicio. Es razonable suponer que el usuario ha hecho esto porque la aplicación dejó de responder, pero no está garantizado: forzar el cierre funcionará en cualquier aplicación.

Respondido el 19 de diciembre de 12 a las 05:12

Utiliza Crashlytics preferiblemente.

Proporciona información instantánea (reciba notificaciones por correo electrónico) sobre informes de fallas en tiempo real y el número de línea exacto de dónde ocurrió una falla.

Respondido el 19 de diciembre de 12 a las 05:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.