2012-04-04 2 views
2

I가 다음과 같은 환경에 (개인 정보 보호하여 MyApplication로 내 오류에서 이름)을 개발하는 응용 프로그램 :모노 뵘 SGen의 GC 대

  • Monotouch 2.1
  • MonoDevelop 2.4.2
  • 맥 OS 10.6.8
  • 아이폰 OS SDK 잘 작동 4.3

은.

이제 MonoDevelop 2.8.8.4를 사용하여 iOS 5.0/5.1 및 Monotouch 5.2.5로 마이그레이션하려고합니다. 내 응용 프로그램은 다음과 같은 오류 즉시 충돌 :

Stacktrace:

at (wrapper managed-to-native) MonoTouch.UIKit.UIApplication.UIApplicationMain (int,string[],intptr,intptr) <IL 0x0009f, 0xffffffff> 
    at MonoTouch.UIKit.UIApplication.Main (string[],string,string) [0x00042] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:29 
    at MonoTouch.UIKit.UIApplication.Main (string[]) [0x00000] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:34 
    at MyApplication.Application.Main (string[]) [0x00000] in /Users/MyPC/Projects/Test/MyApplication/Main.cs:19 
    at (wrapper runtime-invoke) <Module>.runtime_invoke_void_object (object,intptr,intptr,intptr) <IL 0x00050, 0xffffffff> 

기본 스택 트레이스 :

0 MyApplication       0x000908fc mono_handle_native_sigsegv + 284 
1 MyApplication       0x00005c98 mono_sigsegv_signal_handler + 248 
2 libSystem.B.dylib     0x9138145b _sigtramp + 43 
3 ???         0xffffffff 0x0 + 4294967295 
4 libobjc.A.dylib      0x02958753 prepareForMethodLookup + 93 
5 libobjc.A.dylib      0x0294f069 lookUpMethod + 86 
6 libobjc.A.dylib      0x0294f1d6 _class_lookupMethodAndLoadCache + 40 
7 libobjc.A.dylib      0x029620e3 objc_msgSend + 87 
8 UIKit        0x01cba799 -[UIControl sendAction:to:forEvent:] + 67 
9 UIKit        0x01cbcc2b -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527 
10 UIKit        0x01cbba1c -[UIControl touchesBegan:withEvent:] + 277 
11 UIKit        0x01c4ed41 -[UIWindow _sendTouchesForEvent:] + 395 
12 UIKit        0x01c2fc37 -[UIApplication sendEvent:] + 447 
13 UIKit        0x01c34f2e _UIApplicationHandleEvent + 7576 
14 GraphicsServices     0x03fa5992 PurpleEventCallback + 1550 
15 CoreFoundation      0x00df8944 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52 
16 CoreFoundation      0x00d58cf7 __CFRunLoopDoSource1 + 215 
17 CoreFoundation      0x00d55f83 __CFRunLoopRun + 979 
18 CoreFoundation      0x00d55840 CFRunLoopRunSpecific + 208 
19 CoreFoundation      0x00d55761 CFRunLoopRunInMode + 97 
20 GraphicsServices     0x03fa41c4 GSEventRunModal + 217 
21 GraphicsServices     0x03fa4289 GSEventRun + 115 
22 UIKit        0x01c38c93 UIApplicationMain + 1160 
23 ???         0x090a61fc 0x0 + 151675388 
24 ???         0x090a60c8 0x0 + 151675080 
25 ???         0x090a59c0 0x0 + 151673280 
26 ???         0x090a590c 0x0 + 151673100 
27 ???         0x090a5997 0x0 + 151673239 
28 MyApplication       0x0000a002 mono_jit_runtime_invoke + 722 
29 MyApplication       0x00169efe mono_runtime_invoke + 126 
30 MyApplication       0x0016dfe4 mono_runtime_exec_main + 420 
31 MyApplication       0x00173405 mono_runtime_run_main + 725 
32 MyApplication       0x00067205 mono_jit_exec + 149 
33 MyApplication       0x002116d5 main + 2837 
34 MyApplication       0x00003055 start + 53 
35 ???         0x00000004 0x0 + 4 

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.

내가 아이폰 OS SDK 4.3에 배포 할 경우는 동일합니다. 나는 여기에 언급 된 것처럼 새로운 GC SGen에 문제가있을 것이라고 생각하고있다. http://www.infoq.com/news/2012/02/MonoTouch-SGen

업데이트 : 실제로 경고 표시에는 lv.Message = "Copy ..."로 오류가 표시됩니다.

Class Handle: the requested operation cannot be completed because the object has been garbage collected

어떻게 해결할 수 있습니까?

+1

버그를 모노 팀에게 신고하십시오. http://www.mono-project.com/Bugs – skolima

+0

계정을 기다리고 있습니다 ... 어쩌면 최대 3 일 후에 완료됩니다 ... –

+0

** sgen ** 가비지 컬렉터는 MonoTouch 4.x에서 기본적으로 활성화되어 있지 않습니다 (기본값은 5.x가 아닙니다). 버그를보고하려면 https://bugzilla.xamarin.com/을 사용하십시오. 계정 생성은 매우 빨라야합니다. – poupou

답변

8

MonoTouch 4에서 GC는 가능한 한 조기에 특정 유형의 프로그래밍 오류를 잡기 위해보다 적극적으로 실행됩니다. 네이티브 개체가 GC에 의해 일찍 해제되지 않도록 보장합니다.

가장 일반적인 패턴은 방법에서 변수를 선언하는 여기 발생 관리 GC가 otherNativeObject 뷰의 참조를 갖는 것으로 보이지 않는, 그래서 본 방법은 완료 될 때 실행 어떤

void Method() 
{ 
    var view = new UIView(); 
    otherNativeObject.NativeProperty = view; 
} 

GC가보기를 해제합니다. 나중에 otherNativeObject가 뷰를 사용하려고 시도하고보고 한 것과 유사한 크래시로 끝납니다 (정확한 스택 추적 및 메시지는 해제 된 기본 객체에 액세스하는 위치에 따라 조금씩 다릅니다).

UIView view; 
void Method() 
{ 
    view = new UIView(); 
    otherNativeObject.NativeProperty = view; 
} 

이제 GC가보기 메소드 종료를 해제 할 수 없습니다 :

위의 예제에 대한 수정은 단지보기 클래스 변수를 만들기 쉽다.

이 크래시는 MonoTouch 4의 새로운 기능이 아닙니다. GC를보다 공격적으로 만드는 효과는 디버깅 할 때 문제가 발생한다는 것을 의미합니다. 클라이언트가 (매우 무작위로) 충돌 할 때 .

+1

당신에게 따르면 이것은 최고의 프로그래밍 실습입니다! –

+3

동일한 프로세스에서 두 가지 유형의 메모리를 관리하는 부작용입니다 (C#의 ObjectiveC 및 가비지 수집 참조). 가비지 수집기는 ObjectiveC 코드에 대한 모든 것을 알 수 없으므로 (객체가 수집 가능한지 여부를 결정하기 위해 ObjectiveC 코드를 볼 수 없음) 가비지 수집기가 약간의 도움을 필요로합니다. –

+1

이것은 좋은 대답입니다 ... 저에게 도움이되지는 않지만 Xcode 상호 작용으로 어떤 문제가 발생했는지 이해했습니다. 이제는 알 수 없었던 이전의 문제점을 인식 할 수 있다는 것이 좋은데, 단점은 암시 적 참조를 사용할 수 없다는 것입니다. 이것은 모든 유형 또는 UIView에서만 발생합니다. 거기에 좋은 프로그래밍 연습을 사용하는 것이 좋습니다 있습니까? –