2012-01-27 1 views
0

내가 여러 문서를 표시하는 PDF 뷰어를 많이 사용하게 응용 프로그램을 작성하고있어 모든 너무 자주 나는 다음과 같은 예외가 발생 내 문서 라이브러리 검색 후 :MonoTouch_Disposer.Drain 예외 표시 PDF 내용

OutputLayer를 : Ecolab.SalesPad.ContentItem FreedomAire 3 헬멧 스레드 완료 : 스택 트레이스 :

MonoTouch.Foundation.NSObject/MonoTouch_Disposer.Drain (MonoTouch.Foundation.NSObject)에서

에서 < 0x000eb> (래퍼 런타임 호출)을 object.runtime_invoke_dynamic (intptr, intptr, intptr, intptr) < 0xffffffff> at MonoTouch.UIKit.UIApplication.Main (문자열 [], 문자열, 문자열) < 0x0010f> at Ecolab.SalesPad.Touch.Application.Main (string [])/Users/itrgroup/Projects/SalesPad/SalesPad.Touch/Main.cs : 20 (래퍼 런타임 호출) object.runtime_invoke_dynamic (INTPTR, INTPTR, INTPTR, INTPTR) <을 0xFFFFFFFF>

네이티브 스택 트레이스 :

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 

==== ========================================================================================================== =========== 네이티브 코드를 실행하는 동안 SIGSEGV를 얻었습니다. 이것은 대개 이 모노 런타임 또는 기본 라이브러리 중 하나에서 치명적인 오류임을 나타냅니다.

응용 프로그램에서 사용합니다.

매번 MonoTouch.Disposer_Drain에이 정보가 표시됩니다. 때때로 ViewDidAppear가 호출 된 후 때로는 때로는. MonoTouch.Disposer_Drain에 대한 Google 검색의 조언을 찾을 수 없습니다. 누구도 전에 이것에 빠졌습니까? 원인 및/또는 해결 방법에 대한 조언이 있습니까?

감사합니다. 스콧 -

답변

3

이 두 가지 원인이 있습니다

  • A (기본) 개체가 너무 일찍 해제되고있다. 해당 관리 대상 피어에 대한 관리되는 참조가 없지만 네이티브 코드에 여전히 포인터가있는 경우에 발생할 수 있습니다. 이 경우 가비지 수집기가 관리되는 피어를 해제하고 네이티브 개체도 해제됩니다.
  • Dispose는 필요하지 않은 경우 개체에 대해 호출됩니다. 일부 경우에는 Dispose를 호출하면 개체 트리의 개체가 파괴되는 일반적인 순서가 변경 될 수 있습니다.

원인을 추적하는 것은 매우 어려울 수 있지만, 스택 추적에 힌트가있다 :

3 UIKit    0x35107b23 -[UISearchDisplayController dealloc] + 78 

그것이 UISearchDisplayController에 관련이가. 내 생각 엔 UISearchDisplayController의 네이티브 소멸자가 (예를 들어 해당 개체의 소멸자를 호출하기위한) 참조가있는 개체를 호출하려고 시도하고 해당 개체가 이미 해제 된 것 같습니다. 그래서 UISearchDisplayController (일반 필드, 이벤트 핸들러, 콜백 등이 될 수 있음)의 필드에 할당 된 객체가 일찍 해제되는 경우를 보겠습니다.

어떤 개체가 일찍 해제되었는지 알았 으면 GC는 UISearchDisplayController가 살아있는 한 해당 개체를 볼 수 있어야합니다 (일반적인 방법 중 하나는 해당 클래스의 클래스 변수에 할당하는 것입니다).아주 유사한 문제가 여기에 답하고있다

업데이트 : MonoTouch SIGSEGV crash using navigationcontroller and searchdisplaycontroller는, 당신이로 실행중인 될 수있다.