2012-01-27 2 views
0

J'écris une application qui fait un usage intensif de la visionneuse PDF pour afficher divers documents, et de temps après avoir parcouru ma bibliothèque de documents que je rencontre l'exception suivante:MonoTouch_Disposer.Drain Exception afficher le contenu PDF

OutputLayer: Ecolab.SalesPad.ContentItem FreedomAire 3 Casque fil fini: Stacktrace:

à MonoTouch.Foundation.NSObject/MonoTouch_Disposer.Drain (MonoTouch.Foundation.NSObject) < 0x000eb> au (runtime-invocation d'enveloppe) object.runtime_invoke_dynamic (intptr, intptr, intptr, intptr) 0xffffffff> à MonoTouch.UIKit.UIApplication.Main (chaîne [], chaîne, chaîne) < 0x0010f> à Ecolab.SalesPad.Touch.Application.Main (chaîne []) [0x00000] dans/Users/itrgroup/Projects/SalesPad/SalesPad.Touch/main.cs: 20 au (wrapper runtime-invocation) object.runtime_invoke_dynamic (IntPtr, IntPtr, IntPtr, IntPtr) < 0xffffffff>

stacktrace natif:

0 SalesPadTouch      0x00b62b18 mono_handle_native_sigsegv + 456 
1 SalesPadTouch      0x00b484e4 mono_sigsegv_signal_handler + 428 
2 libsystem_c.dylib     0x34db7539 _sigtramp + 48 
3 UIKit        0x35107b23 -[UISearchDisplayController dealloc] + 78 
4 libobjc.A.dylib      0x3564b0c5 _objc_rootRelease + 36 
5 SalesPadTouch      0x00489eb8 wrapper_managed_to_native_MonoTouch_ObjCRuntime_Messaging_void_objc_msgSend_intptr_intptr + 68 
6 SalesPadTouch      0x0028d094 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 200 
7 SalesPadTouch      0x00b48108 mono_jit_runtime_invoke + 2892 
8 SalesPadTouch      0x00c40414 mono_runtime_invoke + 200 
9 SalesPadTouch      0x00cd3944 monotouch_trampoline + 3140 
10 CoreFoundation      0x33e9222b -[NSObject performSelector:withObject:] + 42 
11 Foundation       0x31a01757 __NSThreadPerformPerform + 350 
12 CoreFoundation      0x33f07b03 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14 
13 CoreFoundation      0x33f072cf __CFRunLoopDoSources0 + 214 
14 CoreFoundation      0x33f06075 __CFRunLoopRun + 652 
15 CoreFoundation      0x33e894dd CFRunLoopRunSpecific + 300 
16 CoreFoundation      0x33e893a5 CFRunLoopRunInMode + 104 
17 GraphicsServices     0x35ac9fcd GSEventRunModal + 156 
18 UIKit        0x34fce743 UIApplicationMain + 1090 
19 SalesPadTouch      0x00491160 wrapper_managed_to_native_MonoTouch_UIKit_UIApplication_UIApplicationMain_int_string___intptr_intptr + 240 
20 SalesPadTouch      0x00073d60 Ecolab_SalesPad_Touch_Application_Main_string__ + 152 
21 SalesPadTouch      0x0028d094 wrapper_runtime_invoke_object_runtime_invoke_dynamic_intptr_intptr_intptr_intptr + 200 
22 SalesPadTouch      0x00b48108 mono_jit_runtime_invoke + 2892 
23 SalesPadTouch      0x00c40414 mono_runtime_invoke + 200 
24 SalesPadTouch      0x00c4353c mono_runtime_exec_main + 836 
25 SalesPadTouch      0x00c4253c mono_runtime_run_main + 968 
26 SalesPadTouch      0x00b4f1b8 mono_jit_exec + 244 
27 SalesPadTouch      0x00b424fc main + 4076 
28 SalesPadTouch      0x00002914 start + 52 

==== ============================================= =========== Vous avez un SIGSEGV lors de l'exécution du code natif. Cela indique généralement une erreur fatale dans le mono runtime ou l'une des bibliothèques natives

utilisé par votre application.

Il frappe à chaque fois sur MonoTouch.Disposer_Drain. Parfois, après l'appel de ViewDidAppear, parfois avant. Je ne trouve aucun conseil sur MonoTouch.Disposer_Drain dans une recherche Google. Quelqu'un at-il déjà rencontré cela? Un conseil sur ce que la cause et/ou une solution de contournement serait?

Merci! Scott -

Répondre

3

Il y a deux causes probables à cela:

  • Un objet (natif) est libéré trop tôt. Cela peut se produire s'il n'existe aucune référence gérée à l'homologue géré correspondant, alors que le code natif est toujours associé à un pointeur. Dans ce cas, le garbage collector libérera l'homologue géré (et l'objet natif sera également libéré). Dispose est appelé sur un objet quand il n'est pas nécessaire (l'appel de Dispose manuellement peut, dans de très rares cas, changer l'ordre habituel de destruction des objets dans un arbre d'objets).

Il peut être assez difficile à traquer la cause, mais il y a un indice dans la trace de la pile:

3 UIKit    0x35107b23 -[UISearchDisplayController dealloc] + 78 

il est lié à un UISearchDisplayController. Je suppose que le destructeur natif de UISearchDisplayController essaie d'appeler un objet auquel il fait référence (pour appeler le destructeur de cet objet par exemple), et cet objet a déjà été libéré. Donc, je regarde si des objets assignés aux champs d'un UISearchDisplayController (qui peuvent être des champs normaux, des gestionnaires d'événements, des rappels, etc.) se trouvent libérés tôt. Une fois que vous savez quels objets sont libérés précocement, vous devez vous assurer que le GC peut voir l'objet tant que UISearchDisplayController est actif (un moyen courant est de l'assigner à une variable de classe de la classe appropriée).

Mise à jour

Une question similaire a été répondu ici: MonoTouch SIGSEGV crash using navigationcontroller and searchdisplaycontroller, il peut être ce que vous êtes en cours d'exécution dans.