다른 스레드를 알리기 위해 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로 시그널링됩니다. 메소드 코드는 아래에 복사됩니다.
+ (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 호출을 제거합니다. - 문제는 해결하지만 소켓을 열어 두는 해결책은 분명하지 않습니다.