Xamarin.Mac скрывает SIGSEGV

Я столкнулся с непонятным segfault с xamarin.mac, это (бесполезная) трассировка стека:

  at <unknown> <0xffffffff>
  at (wrapper managed-to-native) MonoMac.AppKit.NSApplication.NSApplicationMain     (int,string[]) <0xffffffff>
  at MonoMac.AppKit.NSApplication.Main (string[]) <0x00097>
  at gitbookpro.mac.MainClass.Main (string[]) <0x00017>
  at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <0xffffffff>

Сбой происходит после обработки SelectionDidChange на NSOutlineView, который выполняет значительную часть обработки.

Трудно точно определить, что именно вызывает этот сбой.

Любые идеи ?


person AaronO    schedule 21.10.2014    source источник


Ответы (1)


Ошибка была вызвана тем, что C# объектов были неправильно собраны мусором.

Они были удалены сборщиком мусора, потому что эти объекты возвращались в код objective-c (собственный код), а поскольку в C# не сохранялась ссылка, сборщик мусора удалял их.

Вот что происходило:

1. create C# obj 2. return obj to native code 3. ... wait a little bit ... 4. turn native object back into to C# obj (in event handlers etc ...) 5. Access C# obj <= This would fail occasionally since it was being garbage collected during step #3

Что ты должен делать :

1. create C# obj 1bis. Keep an extra reference to the object somewhere (in an Dictionary for example) 2. return obj to native code 3. ... wait a little bit ... 4. turn native object back into to C# obj (in event handlers etc ...) 4bis. Remove extra reference 5. Access C# obj <= This would fail occasionally since it was being garbage collected during step #3

Вот и все !

person AaronO    schedule 22.10.2014