2013-04-11 3 views
0

У меня есть следующее свойство, что я Переплет:Повод SIGSEGV в NSArray связывания

@property (nonatomic, readwrite, retain) NSArray* activeTasks; 

То, что я связать со следующим кодом:

[Export("activeTasks", ArgumentSemantic.Retain)] 
NSDictionary[] ActiveTasks { get; } 

Я использую это свойство очень часто. Тем не менее, раз в тысячу попыток я получаю SIGSEGV на get_activeTasks (привязка селектора). Интересно, что я делаю неправильно и почему это происходит очень редко, а не систематически.

at (wrapper managed-to-native) MonoTouch.ObjCRuntime.Messaging.void_objc_msgSend (intptr,intptr) <IL 0x00024, 0xffffffff> 
    at MonoTouch.Foundation.NSObject.InitializeObject (bool) [0x00062] in /Developer/MonoTouch/Source/monotouch/src/Foundation/NSObject.cs:136 
    at MonoTouch.Foundation.NSObject..ctor (intptr,bool) [0x0000d] in /Developer/MonoTouch/Source/monotouch/src/Foundation/NSObject.cs:62 
    at MonoTouch.Foundation.NSObject..ctor (intptr) <IL 0x00003, 0x0002b> 
    at MonoTouch.Foundation.NSDictionary..ctor (intptr) <IL 0x00002, 0x00027> 
    at MonoTouch.Foundation.NSMutableDictionary..ctor (intptr) <IL 0x00002, 0x00027> 
    at (wrapper runtime-invoke) <Module>.runtime_invoke_void__this___intptr (object,intptr,intptr,intptr) <IL 0x00054, 0xffffffff> 
    at (wrapper managed-to-native) System.Reflection.MonoCMethod.InternalInvoke (System.Reflection.MonoCMethod,object,object[],System.Exception&) <IL 0x00030, 0xffffffff> 
    at System.Reflection.MonoCMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) [0x00109] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:536 
    at System.Reflection.MonoCMethod.Invoke (System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:551 
    at System.Activator.CreateInstance (System.Type,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo,object[]) [0x00174] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Activator.cs:299 
    at System.Activator.CreateInstance (System.Type,object[],object[]) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Activator.cs:234 
    at System.Activator.CreateInstance (System.Type,object[]) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System/Activator.cs:229 
    at MonoTouch.ObjCRuntime.Runtime.ConstructNSObject (intptr,intptr) [0x0000d] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/Runtime.cs:210 
    at MonoTouch.ObjCRuntime.Runtime.GetNSObject (intptr) [0x0001f] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/Runtime.cs:259 
    at MonoTouch.Foundation.NSArray.ArrayFromHandle<T> (intptr) [0x0003a] in /Developer/MonoTouch/Source/monotouch/src/shared/Foundation/NSArray.cs:172 
    at TouchDBBinding.CouchServer.get_ActiveTasks() <IL 0x0001b, 0x00073> 

EDIT:

Вот стек обновления трассировки с использованием новой Framework, я не знаю, если это может помочь больше:

StackTrace:

at (wrapper managed-to-native) MonoTouch.Foundation.NSObject.monotouch_create_managed_ref (intptr,intptr,bool) <IL 0x0002d, 0xffffffff> 
    at MonoTouch.Foundation.NSObject.CreateManagedRef (bool) [0x00000] in /Developer/MonoTouch/Source/monotouch/src/Foundation/NSObject.cs:93 
    at MonoTouch.Foundation.NSObject.InitializeObject (bool) [0x000cc] in /Developer/MonoTouch/Source/monotouch/src/Foundation/NSObject.cs:88 
    at MonoTouch.Foundation.NSObject..ctor (intptr,bool) [0x0000d] in /Developer/MonoTouch/Source/monotouch/src/shared/Foundation/NSObject2.cs:85 
    at MonoTouch.Foundation.NSObject..ctor (intptr) <IL 0x00003, 0x0002b> 
    at MonoTouch.Foundation.NSDictionary..ctor (intptr) <IL 0x00002, 0x00027> 
    at MonoTouch.Foundation.NSMutableDictionary..ctor (intptr) <IL 0x00002, 0x00027> 
    at (wrapper runtime-invoke) <Module>.runtime_invoke_void__this___intptr (object,intptr,intptr,intptr) <IL 0x00054, 0xffffffff> 
    at (wrapper managed-to-native) System.Reflection.MonoCMethod.InternalInvoke (System.Reflection.MonoCMethod,object,object[],System.Exception&) <IL 0x00030, 0xffffffff> 
    at System.Reflection.MonoCMethod.Invoke (object,System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) [0x00109] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:530 
    at System.Reflection.MonoCMethod.Invoke (System.Reflection.BindingFlags,System.Reflection.Binder,object[],System.Globalization.CultureInfo) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/MonoMethod.cs:545 
    at System.Reflection.ConstructorInfo.Invoke (object[]) [0x0000e] in /Developer/MonoTouch/Source/mono/mcs/class/corlib/System.Reflection/ConstructorInfo.cs:62 
    at MonoTouch.ObjCRuntime.Runtime.ConstructNSObject (intptr,intptr) [0x00051] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/Runtime.cs:269 
    at MonoTouch.ObjCRuntime.Runtime.GetNSObject (intptr) [0x0001f] in /Developer/MonoTouch/Source/monotouch/src/ObjCRuntime/Runtime.cs:328 
    at MonoTouch.Foundation.NSArray.ArrayFromHandle<T> (intptr) [0x00044] in /Developer/MonoTouch/Source/monotouch/src/shared/Foundation/NSArray.cs:188 
    at TouchDBBinding.CouchServer.get_ActiveTasks() <IL 0x0001b, 0x00073> 

ли возможно, что во внутренней работе MonoTouch есть что-то, что может быть проблемой, когда NSArray * с сохранением привязан к NSDictionary [] и что это свойство имеет значение null? Или это возможно, потому что у него есть нулевой контент?

Спасибо, Пол

ответ

1

Трассировка стека указывает на то, что авария происходит, когда MonoTouch пытается сохранить один из элементов NSArray.

Одна из возможных причин состоит в том, что конкретный элемент уже освобожден (или иным образом поврежден). В частности, это не потому, что элемент имеет значение null (этот случай обрабатывается по-разному).

+0

Как мне подойти к этой проблеме? Есть ли что-нибудь, что я могу сделать, чтобы исправить это, или это 100% на стороне Objective-C, что он сбой? Случайные сбои определенно не то, с чем я могу жить. – airpaulg

+1

Попробуйте скопировать сгенерированный код для ActiveTasks и добавить дополнительную информацию об отладке (например, распечатать каждый указатель в массиве, или вы могли бы добавить запрос на сохранение/освобождение вручную для каждого объекта, чтобы убедиться, что они не сбой, прежде чем вызывать ArrayFromHandle на массив), и если вы используете симулятор для воспроизведения, вы можете подключить gdb к процессу, чтобы выполнить собственную отладку. –

+0

OK Я проверю! Спасибо за советы Рольфа. – airpaulg

Смежные вопросы