2015-01-04 7 views
0

다른 스레드를 알리기 위해 pthread_kill 호출에서 svC#128 ARM 명령어와 관련된 Xcode의 디버거로 예기치 않은 중단이 발생합니다. iOS에서이 문제와 관련된 StackOverflow 관련 질문을 많이 보았습니다.하지만 도움이되지 못했습니다. 이 경우 디버그 -> 계속 (^ ⌘Y)을 반복하면 문제가 해결되고 명백한 부작용없이 실행이 계속됩니다. 또한 디버거 외부에서 실행되면 앱이 정상적으로 작동합니다. 내 목표는 왜 이런 일이 일어나는지 이해하고 의도 한 경우를 제외하고는 디버거에 침입하지 않는 것입니다.svc pthread_kill의 # 128이 예기치 않게 디버거에 침입 했습니까?

실수로 이러한 신호에 휴식을 설정했을 수있는 Xcode 설정이 있습니까?

Google의 Objective-C Transpiler (j2objc)를 사용하고 있습니다. 다른 iOS 개발자가 j2objc와 관련없는이 문제를 언급했기 때문에 그 원인이라고 생각하지 않습니다. j2objc JRE (Java Runtime Environment) 에뮬레이션 프로젝트가 다른 차단 된 스레드에 신호를 보낼 때 발생합니다. 그것은 지속적으로 신호하기 위해 3 개의 스레드를 가지고 있습니다. Debug-> Continue를 세 번 수행하면 프로그램 실행이 문제없이 진행되거나 명백한 부작용이 발생합니다. 프로젝트에는 중단 점이 없습니다.

응용 프로그램이 Java DatagramSocket 클래스를 사용하는 다른 스레드를 시작할 때 생성합니다. Java 코드가 올바르게 작동합니다. transpired Objective-C 코드는 디버거에서 성가신 휴식을 제외하고는 올바르게 작동합니다. 커널 pthread_kill은 방법에

main (1)Queue : com.apple.main-thread (serial) 
#0 0x0000000195557270 in __pthread_kill() 
#1 0x00000001955f5228 in pthread_kill() 
// Java Runtime Environment Emulation 
#2 0x00000001002f7898 in +[AsynchronousSocketCloseMonitor signalBlockedThreads:]() 
#3 0x00000001002f9754 in LibcoreIoIoBridge_closeSocketWithJavaIoFileDescriptor_() 
#4 0x00000001001f4894 in -[JavaNetPlainDatagramSocketImpl close]() 
// My Code 
#5 0x000000010016db88 in <my code>... 

현지 조립 ... 스택 프레임에서

libsystem_kernel.dylib`__pthread_kill: 
0x195557268: movz x16, #328 
0x19555726c: svc #128 
// The debugger lands on the following line but I think svC#128 is the cause 
0x195557270: b.cc 0x195557288    ; __pthread_kill + 32 
0x195557274: stp fp, lr, [sp, #-16]! 
0x195557278: mov fp, sp 
0x19555727c: bl  0x19553e59c    ; cerror_nocancel 
0x195557280: mov sp, fp 
0x195557284: ldp fp, lr, [sp], #16 
0x195557288: ret 

가장 가까운 비 커널 함수가 signalBlockedThreads입니다 :

이 인터럽트의 스택 프레임입니다. 내 코드가 소켓을 닫을 때 signalBlockedThreads은 모든 스레드를 반복하면서 특정 파일 설명자에 대해 차단 된 것을 찾습니다 (방금 닫은 포트 번호에 해당합니다). 블로킹 된 관련 스레드의 경우, 각각 pthread_kill로 시그널링됩니다. 메소드 코드는 아래에 복사됩니다.

https://github.com/google/j2objc/blob/765354b620b2c0248945b27062209620d4cf5e40/jre_emul/android/libcore/luni/src/main/java/libcore/io/AsynchronousCloseMonitor.java#L89

+ (void)signalBlockedThreads:(int)fd { 
    pthread_mutex_lock(&blockedThreadListMutex); 
    for (AsynchronousSocketCloseMonitor* it = blockedThreadList; it != NULL; it = it->mNext) { 
    if (it->mFd == fd) { 
     // MY ADDED COMMENT: BLOCKED_THREAD_SIGNAL == SIGUSR2 in this code 
     pthread_kill(it->mThread, BLOCKED_THREAD_SIGNAL); 
     // Keep going, because there may be more than one thread... 
    } 
    } 
    pthread_mutex_unlock(&blockedThreadListMutex); 
} 

디버그 성공없이 시도 : 이것은 자바 파일, 그것이 j2objc의 transpiler에 의해 보존 목표 - C 코드를 삽입 한 경우에도 파일 링크에 대한

, * "모든 예외"중단 점 추가 및 제거 - 아무 것도이 코드에 의해 노출되지 않음 * closeSocket 호출을 제거합니다. - 문제는 해결하지만 소켓을 열어 두는 해결책은 분명하지 않습니다.

답변