MonoTouch_Disposer.Drain显示PDF内容的异常

时间:2012-01-27 21:50:17

标签: xamarin.ios

我正在编写一个大量使用PDF查看器来显示各种文档的应用程序,并且在浏览我的文档库后经常遇到以下异常:

OutputLayer:Ecolab.SalesPad.ContentItem FreedomAire 3头盔 线程完成: 堆栈跟踪:

在MonoTouch.Foundation.NSObject / MonoTouch_Disposer.Drain(MonoTouch.Foundation.NSObject)< 0x000eb>   at(wrapper runtime-invoke)object.runtime_invoke_dynamic(intptr,intptr,intptr,intptr)< 0xffffffff>   在MonoTouch.UIKit.UIApplication.Main(string [],string,string)< 0x0010f>   在/Users/itrgroup/Projects/SalesPad/SalesPad.Touch/Main.cs:20中的Ecolab.SalesPad.Touch.Application.Main(string [])[0x00000]   at(wrapper runtime-invoke)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之后,有时在调用之前。我在Google搜索中找不到有关MonoTouch.Disposer_Drain的任何建议。有没有人遇到过这个?关于原因和/或解决方法的任何建议?

谢谢! 斯科特 -

1 个答案:

答案 0 :(得分:3)

这可能有两个原因:

  • 过早释放(本机)对象。如果没有对相应的受管对等方的托管引用,则会发生这种情况,而本机代码仍然有指向它的指针。在这种情况下,垃圾收集器将释放托管对等体(并且也释放本机对象)。
  • 当一个对象不需要时调用Dispose(在一些非常罕见的情况下,调用Dispose手动可能会改变对象树中对象的通常顺序)。

跟踪原因可能非常困难,但堆栈跟踪中有一个提示:

3   UIKit              0x35107b23 -[UISearchDisplayController dealloc] + 78

它与UISearchDisplayController有关。我的猜测是UISearchDisplayController的本机析构函数试图调用它有引用的对象(例如,调用该对象的析构函数),并且该对象已被释放。所以我会看看分配给UISearchDisplayController字段的任何对象(可以是普通字段,事件处理程序,回调等)是否恰好早期被释放。

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

<强>更新

此处已回答了一个非常类似的问题:MonoTouch SIGSEGV crash using navigationcontroller and searchdisplaycontroller,这可能是您遇到的问题。