2013-02-28 1 views
0

내 Mac OS 응용 프로그램을 테스트하려고하는데, 10.8에서 제대로 작동했지만 Mac 10.6.3에서 테스트를 시작할 때 (iatkos s3) 문제가 발생했습니다. .performSelectorInBackground : Mac OS X 10.6.3에서 즉시 충돌했습니다.

먼저 Macbook air에서 10.6.3 (하드웨어는 소프트웨어보다 최신 버전)을 설치할 수 없으므로 별도의 컴퓨터를 사용하여 10.6.3을 설치해야합니다. 내가 한 것은 xcode에서 .app 파일을 가져 와서 10.6.3 응용 프로그램 폴더에 넣은 다음 실행하는 것입니다.

나는 거기에 약간의 추적 로그를 넣고 여기에 내 코드입니다 : 당신은 최대한 빨리 myOtherMethod 전화로, 내 코드에서 볼 수 있듯이

- (void) startMethodInBackground: (id) sender { 
    NSLog(@"line 101"); //this shows 
    [self performSelectorInBackground:@selector(myOtherMethod:) withObject:sender]; 
    NSLog(@"line 102"); //not showing 
} 

- (void) myOtherMethod: (id) sender { 
    NSLog(@"line 201"); //not showing 
    @autoreleasepool { 
     NSLog(@"line 202"); //again not showing 
     @synchronized (self) { 
      NSLog(@"line 203"); //not showing 
      ... ... 
     } 
    } 
} 



Version:   1.0 (1) 
Code Type:  X86-64 (Native) 
Parent Process: launchd [1126] 

Date/Time:  2013-02-28 16:53:10.668 -0500 
OS Version:  Mac OS X 10.6.3 (10D573) 
Report Version: 6 

Exception Type: EXC_BAD_ACCESS (SIGSEGV) 
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000 
Crashed Thread: 2 
... (too long so I trimmed it) 
... 
    Thread 2 Crashed: 
0 ???        000000000000000000 0 + 0 
1 com.apple.Foundation   0x00007fff814e4ead __NSThread__main__ + 1429 
2 libSystem.B.dylib    0x00007fff86db38b6 _pthread_start + 331 
3 libSystem.B.dylib    0x00007fff86db3769 thread_start + 13 

Thread 2 crashed with X86 Thread State (64-bit): 
    rax: 0x0000000000000000 rbx: 0x0000000100863400 rcx: 0x0000000000000000 rdx: 0x00000001001417b0 
    rdi: 0x00000001001417b0 rsi: 0x0000000000000000 rbp: 0x0000000100480c90 rsp: 0x0000000100480b08 
    r8: 0x0000000000000000 r9: 0x0000000100201530 r10: 0x0000000100210870 r11: 0x0000000100002120 
    r12: 0x00007fff5fbfe800 r13: 0x0000000000001b07 r14: 0x00007fff814e4918 r15: 0x0000000102e0ec20 
    rip: 0x0000000000000000 rfl: 0x0000000000010202 cr2: 0x0000000000000000 

: performSelectorInBackground를 사용하여 :,가 추락!

그래서 제 질문은 다음과 같습니다

  1. 어떤 이유는 performSelectorInBackground 추락 부르심 왜? performSelectorInBackground 메서드를 확인한 결과 10.6 (apple 문서에서는 10.5 이상이라고합니다)에서 정상적으로 작동하므로 실제로 발생한 결과가 발생했습니다.

  2. 충돌 보고서는 실제로 나에게 의미가 없으므로 실생활에서 어떻게 그러한 보고서로 디버그 할 수 있습니까? xcode에서 문제가 발생하면 충돌이 발생하고 어떤 방법으로 문제가 발생했는지, 문제는 무엇인지 알려주지 만 볼 수 있듯이 충돌 보고서는 나에게 많은 것을 알려주지 않았습니다!

도움을 주시면 감사하겠습니다. Josh

+0

개체를 할당 해제 할 수 있습니까? – paulmelnikow

답변

0

손상된 스택처럼 보입니다.

아마도 큰 C 배열처럼 myOtherMethod에 엄청난 양의 메모리를 할당하고 있습니까? 주 스레드에서 myOtherMethod으로 전화하면 어떻게됩니까?

+0

메모리 할당과 아무 관련이 없습니다. 더미 응용 프로그램을 만들었고, performSelectorsInBackground를 사용했습니다.이 더미 메서드 내에서 더미 메서드를 호출하기 위해 @ autoreleasepool 다음에 @ synchronized (self) 및 다른 간단한 추적을 사용했습니다. @synchronized를 넣으면 @synchronized를 꺼내면 크래시가 발생하지 않습니다. 충돌합니다. 내가 synchronized를 사용하는 이유는 다중 스레드가 myOtherMethod를 동시에 실행하지 않도록하려는 것입니다. 스레드 1이 myOtherMethod를 실행 중이면 스레드 2가 스레드 1이 완료 될 때까지 대기해야합니다. 그러나 10.6에서 충돌 한 이유는 10.8이 아닌가? – Josh