2011-05-23 6 views
5

Estoy tratando de implementar un manejador de excepción general útil para mi código MonoTouch.Rastros de pila MonoTouch no detallados

Si adjunto un controlador a AppDomain.CurrentDomain.UnhandledException, no hay ningún rastro de pila presente, es decir, la propiedad .StackTrace es nula o está vacía.

Si envuelvo mi llamada UIApplication.Main(args) en try {} catch {}, el seguimiento de pila no contiene ninguna información útil:

at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x00000] in <filename unknown>:0 
at MonoTouch.UIKit.UIApplication.Main (System.String[] args) [0x00000] in <filename unknown>:0 
at MyNamespace.MyProduct.MyProject.Application.Main (System.String[] args) [0x00000] in <filename unknown>:0 

es decir, que no va más profundo que el método main() donde tomé la excepción .

¿Alguna idea de cómo puedo obtener algo de información más útil en el seguimiento de la pila, o todo está optimizado completamente por la compilación AOT? (El seguimiento de la pila es el esperado en modo de depuración).

Respuesta

1

Usted no será capaz de obtener los números de línea o nombres de archivos en código de liberación. Esa información es eliminada. Sin embargo, aún debería poder obtener el seguimiento completo de la pila en su código para, al menos, ver la jerarquía de clases/llamadas.

Supongo que debe estar investigando esto después de todo, ya que no puede depurar ni detectar excepciones en ejecución en una compilación de lanzamiento. Lo que tiendo a hacer es registrar mis excepciones en un archivo de registro para ver más adelante.

Este proceso comienza con el siguiente código:

StackTrace trace = new StackTrace(true); 

    foreach(StackFrame frame in trace.GetFrames()) 
     ... log data to log file 

También puede crear objetos con una excepción StackTrace también. Comenzaría a jugar por ahí. Tenga en cuenta que en muchas situaciones, no puede obtener un seguimiento de la pila si el error se produce en lo profundo de la parte de iOS, ya que Mono no está expuesto a esos datos. Una excepción o bloqueo que ocurre que solo sube al método principal suele indicar un problema de nivel inferior.

3

Utilice la opción de línea de comandos --debug o seleccione la configuración "Depurar | iPhone" en MonoDevelop.

Recuerde que esta opción resultará en ejecución más lenta, pero usted recibirá los números de línea en excepciones etc.

+0

Al igual que la pregunta dice, sé que esto funciona bien en modo de depuración. Quería incluir este controlador en el código publicado, pero no tiene sentido si toda la información de depuración está completamente eliminada. La pregunta es: ¿no hay forma de obtener un seguimiento de pila en el código del modo de lanzamiento? – tomfanning

Cuestiones relacionadas