在 Xamarin.iOS 应用程序中查找 SIGSEGV 的原因

Posted

技术标签:

【中文标题】在 Xamarin.iOS 应用程序中查找 SIGSEGV 的原因【英文标题】:Finding the cause of SIGSEGV in Xamarin.iOS app 【发布时间】:2013-07-31 08:27:23 【问题描述】:

我正在使用 Xamarin.ios 开发我的第一个真正的应用程序。大多数情况下,该应用运行良好,但每天有几次崩溃并出现以下堆栈跟踪:

mono-rt: Stacktrace:
mono-rt:   at <unknown> <0xffffffff>
mono-rt:   at (wrapper managed-to-native) MonoTouch.Foundation.NSObject.monotouch_release_managed_ref (intptr) <IL 0x00023, 0xffffffff>
mono-rt:   at MonoTouch.Foundation.NSObject.ReleaseManagedRef () [0x00000] in /Developer/MonoTouch/Source/monotouch/src/Foundation/NSObject.cs:98
mono-rt:   at MonoTouch.Foundation.NSObject/NSObject_Disposer.Drain (MonoTouch.Foundation.NSObject) [0x00062] in /Developer/MonoTouch/Source/monotouch/src/shared/Foundation/NSObject2.cs:545
mono-rt:   at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>
mono-rt:   at <unknown> <0xffffffff>
mono-rt:   at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) <IL 0x0009f, 0xffffffff>
mono-rt:   at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38
mono-rt:   at Diet52App.Application.Main (string[]) [0x00008] in /Users/danielnordmark/Projects/Diet52App/Diet52App/Main.cs:16
mono-rt:   at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff>

mono-rt: 
Native stacktrace:


mono-rt: 
=================================================================
Got a SIGSEGV while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries 
used by your application.
=================================================================

我的猜测是某些对象在我尝试使用它之前就被垃圾收集了。但是我有点迷茫如何找出我的代码中发生这种情况的时间和地点。

如何找出问题所在?非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

问题似乎与我的 UITableViewController 有关,我有一个基类和两个不同的实例。这两者之间的冲突导致了 SIGSEGV 错误。

感谢https://***.com/a/6769885/248905这个答案,我设法追踪了问题

我必须做的唯一修改是像这样用 InvokeOnMainThread 包装代码,

更新: 在 Xamarin 与 Rolf 联系后,我更新了我的解决方案,正确的解决方法是将代码放入 ViewDidDissapear 而不是 Dispose。

public override void ViewDidDisappear (bool animated)

    searchController.SearchResultsSource = null;
    searchController.Delegate = null;
    base.ViewDidDisappear (animated);

【讨论】:

以上是关于在 Xamarin.iOS 应用程序中查找 SIGSEGV 的原因的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Xamarin iOS PickView 获取价值?

Xamarin.forms(或)xamarin.ios/xamarin.android(或)本机

对于iOS 9 +,后台Fetch在Xamarin.ios上运行一次

如何在 Xamarin(iOS 和 Android)应用程序中使用 Windows 命名空间?

Xamarin.iOS SKProductRequest 事件未在 Debug 中调用(在 iOS 15 和 xCode 13 之前工作)

Xamarin.IOS 导入现有情节提要