【问题标题】:MonoTouch_Disposer.Drain Exception displaying PDF contentMonoTouch_Disposer.Drain 异常显示 PDF 内容
【发布时间】:2012-01-27 21:50:17
【问题描述】:

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

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

在 MonoTouch.Foundation.NSObject/MonoTouch_Disposer.Drain (MonoTouch.Foundation.NSObject) 在(包装器运行时调用)object.runtime_invoke_dynamic(intptr,intptr,intptr,intptr) 在 MonoTouch.UIKit.UIApplication.Main (string[],string,string) 在 Ecolab.SalesPad.Touch.Application.Main (string[]) [0x00000] 在 /Users/itrgroup/Projects/SalesPad/SalesPad.Touch/Main.cs:20 at (wrapper runtime-invoke) 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。这通常表明 单声道运行时或本机库之一中的致命错误

由您的应用程序使用。

它每次都在 MonoTouch.Disposer_Drain 上命中。有时在调用 ViewDidAppear 之后,有时在调用之前。我在 Google 搜索中找不到关于 MonoTouch.Disposer_Drain 的任何建议。有没有人遇到过这个?关于原因和/或解决方法的任何建议?

谢谢! 斯科特——

【问题讨论】:

    标签: xamarin.ios


    【解决方案1】:

    这有两个可能的原因:

    • (本机)对象被释放得太早。如果没有对相应托管对等方的托管引用,而本机代码仍然有指向它的指针,则可能会发生这种情况。在这种情况下,垃圾收集器将释放托管对等体(并且本机对象也被释放)。
    • 在不需要时对对象调用 Dispose(在极少数情况下,手动调用 Dispose 可能会更改对象树中的对象被销毁的通常顺序)。

    追查原因可能相当困难,但堆栈跟踪中有一个提示:

    3   UIKit              0x35107b23 -[UISearchDisplayController dealloc] + 78
    

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

    一旦您知道哪个对象被提前释放,您必须确保只要 UISearchDisplayController 还活着,GC 就可以看到该对象(一种常见的方法是将其分配给适当类的类变量)。

    更新

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-02
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      相关资源
      最近更新 更多