OK, así que imagina que mi punto de interrupción en objc_exception_throw
acaba de activarse. Estoy sentado en el indicador del depurador, y quiero obtener más información sobre el objeto de excepción. ¿Donde lo encuentro?Xcode/LLDB: ¿Cómo obtener información sobre una excepción que acaba de lanzarse?
Respuesta
El objeto de excepción se pasa como primer argumento a objc_exception_throw
. LLDB ofrece $arg1
.. $argn
variables para referirse a los argumentos de la convención de llamada correcta, por lo que es fácil de imprimir los detalles de la excepción:
(lldb) po $arg1
(lldb) po [$arg1 name]
(lldb) po [$arg1 reason]
Asegúrese de seleccionar el marco objc_exception_throw
en la pila de llamadas antes de ejecutar estos comandos. Consulte "Depuración avanzada y el desinfectante de direcciones" en los videos de la sesión WWDC15 para ver esto en el escenario.
información obsoleta
Si estás en el BGF, la sintaxis para referirse al primer argumento depende de las convenciones de llamada de la arquitectura se está ejecutando en. Si está depurando en un dispositivo iOS real, el puntero al objeto está en el registro r0
. Para imprimir o enviar mensajes a ella, utilice la siguiente sintaxis sencilla:
(gdb) po $r0
(gdb) po [$r0 name]
(gdb) po [$r0 reason]
En el iPhone Simulator, todos los argumentos de la función se pasan en la pila, por lo que la sintaxis es mucho más horrible. La expresión más corta que pude construir es *(id *)($ebp + 8)
. Para hacer las cosas menos dolorosa, se sugiere emplear una variable de conveniencia:
(gdb) set $exception = *(id *)($ebp + 8)
(gdb) po $exception
(gdb) po [$exception name]
(gdb) po [$exception reason]
También puede establecer $exception
automáticamente siempre que el punto de interrupción se activa mediante la adición de una lista de comandos a la objc_exception_throw
punto de interrupción.
(Tenga en cuenta que en todos los casos que he probado, el objeto de excepción también estaba presente en el eax
y edx
registros en el momento del punto de interrupción golpeó. No estoy seguro de que siempre va a ser el caso, sin embargo.)
Añadido a partir de comentarios a continuación:
En LLDB, seleccione el marco de pila para objc_exception_throw
e introduzca este comando:
(lldb) po *(id *)($esp + 4)
¿Cómo se podría hacer esto en lldb? Aparece un error "error: la referencia a 'id' es ambigua" – offex
¿Puedes proporcionar la fuente de esta información? me gustaría leer más al respecto –
Las convenciones de llamadas iOS/ARM están documentadas en la [Guía de llamadas a la función ABI de iOS] (http://developer.apple.com/library/ios/documentation/Xcode/Conceptual/iPhoneOSABIReference/iPhoneOSABIReference .pdf), que se basa en [Procedimiento de llamada estándar para ARM Architecture ABI] (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0042e/index.html) El simulador de iOS usa las [convenciones de llamada de OS X en x86] (http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/LowLevelABI/130-IA-32_Function_Calling_Conventions/IA32.html#//apple_ref/doc/uid/TP40002492-SW4). –
este lugar que le dirá cómo hacer frente a estos errores:
http://www.markj.net/debugging-tip-objc_exception_throw-breakpoint/
Se le muestra cómo agregar puntos de quiebre y averiguar donde su sucediendo en su código. Eso te mostrará dónde está esa cosa.
En el momento de escribir esto, esta publicación es mi principal éxito de Google para: lldb print exception. Por lo tanto, estoy agregando esta respuesta a la cuenta para lldb y x86_64.
Mis intentos de encontrar la excepción con po $eax
han fallado con error: Couldn't materialize struct: Couldn't read eax (materialize)
. Otros intentos descritos en documentos vinculados de respuestas anteriores también fallaron.
La clave fue que tuve que hacer clic primero en el marco objc_exception_throw
en mi hilo principal. lldb no comienza en ese marco.
En todos mis ejemplos de búsqueda y siguientes, this blog entry fue el primero en explicar las cosas de una manera que funcionó para mí. Es más moderno, publicado en agosto de 2012.
Si tiene una declaración catch, ponga un punto de interrupción allí y podrá inspeccionar el objeto de excepción en ese punto.
Si no tiene una declaración catch, continúe.
Usted obtendrá un mensaje en el terminal de la siguiente manera:
Terminación de aplicación debido a excepción no detectada 'NSInvalidArgumentException', razón: '* - [__ NSPlaceholderDictionary initWithObjects: forKeys: Count:]: intento de insertar nil objeto de objetos [0] '
Sin embargo,, probablemente esté buscando una forma de inspeccionarlo sin continuar, ya que perderá su buen rastro de pila al finalizar la aplicación.
Para eso parece que la respuesta de Fnord es la mejor, pero no pude hacerlo funcionar en LLDB.
en nuevos simuladores (iOS 8, 64 bits) Xcode 6 im utilizando en el marco de excepción: objc_exception_throw
po $rax
en 32 bits:
po $eax
¿Cuál es rax?
Rax es un 64bits registro que sustituye a la antigua eax
¿Cómo encontrar todos los registros?
register read
Hmm ... En Xcode 6.1, obtengo: (lldb) po $ rax error: No se pudo materializar: couldn' t leer el valor de registrar rax Errored out en Execute, could not PrepareToExecuteJITExpression – bradheintz
@bradheintz simulator or device? Intenté esto con 6.0.1 –
¿Puedes indicarme un enlace a tu fuente para eso? ¡Gracias! –
- 1. ¿Cómo puedo volver a lanzar una excepción que contiene información sobre una excepción original?
- 2. obtener información sobre un conjunto
- 3. obtener información sobre las dependencias de maven
- 4. Cómo obtener información sobre selección de fuentes en Mathematica
- 5. JavaScript - obtener información detallada sobre el navegador
- 6. Oracle: cómo obtener información sobre campos de índice, etc.
- 7. ¿Cómo obtener información sobre el sistema de archivos del disco?
- 8. Agregar información adicional a una excepción personalizada
- 9. ¿Cómo obtener más información sobre el evento Application Hang?
- 10. ¿Cómo obtener información programáticamente sobre sucursales en TFS?
- 11. ¿Cómo obtener información sobre el búfer/archivo actual en emacs?
- 12. ¿Cómo obtener información sobre un tipo definido por el usuario?
- 13. Obligar a que aparezca una información sobre herramientas Java
- 14. cómo obtener información sobre el cliente en Node.js
- 15. Obtener información sobre un objeto de confirmación SHA-1?
- 16. JQuery JSTree: agregue una información sobre herramientas
- 17. ¿Dónde puedo obtener información sobre el kernel de Windows?
- 18. Necesito más información sobre HandleError
- 19. ¿Cómo obtener la información sobre herramientas para que funcione con un ComboBox?
- 20. Cómo inicializar información sobre la autorización
- 21. Más información sobre informática distribuida
- 22. ¿Dónde puedo obtener información sobre los sistemas de recomendación?
- 23. ¿Cómo agregar una información sobre herramientas a un gráfico svg?
- 24. C# obtener información sobre la ventana activa actual
- 25. Cómo mostrar una información sobre herramientas de .NET Balloon?
- 26. ¿Cómo obtener información sobre el "tipo actual" dentro de una estructura/clase?
- 27. ¿Mejores prácticas para obtener información sobre la versión?
- 28. ¿Cómo obtener información sobre herramientas para mostrar cuando se usa el mouse sobre ToolStripStatusLabel?
- 29. Información sobre L-Systems
- 30. Información sobre herramientas en una imagen
No está en la consola? – Steve
Recuerde, la excepción acaba de aparecer, su descripción aún no se ha impreso en la consola. –
Echa un vistazo a esta pregunta: http://stackoverflow.com/questions/711650/ –