Xamarin.ios 显示PDF内容的MonoTouch_Disposer.Drain异常

Xamarin.ios 显示PDF内容的MonoTouch_Disposer.Drain异常,xamarin.ios,Xamarin.ios,我正在编写一个应用程序,它大量使用PDF viewer来显示各种文档,在浏览文档库后,我经常会遇到以下异常: 输出层:Ecolab.SalesPad.ContentItem FreeDomainire 3头盔 螺纹加工: 堆栈跟踪: 0 SalesPadTouch 0x00b62b18 mono_handle_native_sigsegv + 456 1 SalesPadTouch 0x00b484e

我正在编写一个应用程序,它大量使用PDF viewer来显示各种文档,在浏览文档库后,我经常会遇到以下异常:

输出层:Ecolab.SalesPad.ContentItem FreeDomainire 3头盔 螺纹加工: 堆栈跟踪:

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

在单调的基础上。 at(包装器运行时调用)object.runtime_invoke_dynamic(intptr、intptr、intptr、intptr) 位于MonoTouch.UIKit.UIApplication.Main(字符串[],字符串,字符串) 位于/Users/itrgroup/Projects/SalesPad/SalesPad.Touch/Main.cs:20中的Ecolab.SalesPad.Touch.Application.Main(字符串[])[0x00000] at(包装器运行时调用)object.runtime_invoke_dynamic(intptr、intptr、intptr、intptr)

本机堆栈跟踪:

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。这通常表明 mono运行时或某个本机库中出现致命错误

由您的应用程序使用。 它每次都会在MonoTouch.Disposer\u排水管上点击此按钮。有时在调用ViewDidAppear之后,有时在调用ViewDidAppear之前。我在谷歌搜索中找不到任何关于MonoTouch.Disposer_Drain的建议。以前有人碰到过这个吗?关于原因和/或解决方法有何建议

谢谢!
斯科特--

这可能有两个原因:

  • 过早释放(本机)对象。如果没有对应的托管对等方的托管引用,而本机代码仍有指向它的指针,则可能发生这种情况。在这种情况下,垃圾收集器将释放受管对等对象(同时也释放本机对象)
  • 在不需要对象时对其调用Dispose(在某些非常罕见的情况下,手动调用Dispose可能会更改对象树中对象销毁的通常顺序)
很难找到原因,但堆栈跟踪中有一个提示:

3   UIKit              0x35107b23 -[UISearchDisplayController dealloc] + 78
它与UISearchDisplayController相关。我猜想UISearchDisplayController的本机析构函数正试图调用它引用的对象(例如调用该对象的析构函数),而该对象已经被释放。因此,我将查看是否有任何分配给UISearchDisplayController字段的对象(可以是普通字段、事件处理程序、回调等)被提前释放

一旦知道提前释放了哪个对象,就必须确保只要UISearchDisplayController处于活动状态,GC就可以看到该对象(一种常见的方法是将其分配给相应类的类变量)

更新


这里回答了一个非常类似的问题:,这可能是您遇到的问题。

这可能有两个原因:

  • 过早释放(本机)对象。如果没有对应的托管对等方的托管引用,而本机代码仍有指向它的指针,则可能发生这种情况。在这种情况下,垃圾收集器将释放受管对等对象(同时也释放本机对象)
  • 在不需要对象时对其调用Dispose(在某些非常罕见的情况下,手动调用Dispose可能会更改对象树中对象销毁的通常顺序)
很难找到原因,但堆栈跟踪中有一个提示:

3   UIKit              0x35107b23 -[UISearchDisplayController dealloc] + 78
它与UISearchDisplayController相关。我猜想UISearchDisplayController的本机析构函数正试图调用它引用的对象(例如调用该对象的析构函数),而该对象已经被释放。因此,我将查看是否有任何分配给UISearchDisplayController字段的对象(可以是普通字段、事件处理程序、回调等)被提前释放

一旦知道提前释放了哪个对象,就必须确保只要UISearchDisplayController处于活动状态,GC就可以看到该对象(一种常见的方法是将其分配给相应类的类变量)

更新

这里回答了一个非常类似的问题:,这可能是你遇到的问题