svC#128 в pthread_kill неожиданно взломал отладчик?
Я вижу неожиданные взломы отладчика в Xcode, связанные с svc #128
Инструкция ARM от вызова pthread_kill для сигнализации другого потока. Я видел это в ряде вопросов Stackru, связанных с этой проблемой на iOS, но они не помогли мне. В этом случае выполнение Debug->Continue (^⌘Y) многократно решает проблему, и выполнение продолжается без каких-либо явных побочных эффектов. Кроме того, если он запускается вне отладчика, то приложение работает нормально. Моя цель - понять, почему это происходит, и избежать взлома отладчика, кроме случаев, когда это необходимо.
Есть ли настройка XCode, которую я мог случайно установить, которая нарушает эти сигналы?
Я использую Java от Google для Objective-C Transpiler (j2objc), хотя другие разработчики iOS упоминали эту проблему, не связанную с j2objc, поэтому я не верю, что это причина. Это происходит, когда проект эмуляции среды выполнения Java j2objc сигнализирует другим заблокированным потокам. Он последовательно имеет 3 потока для подачи сигнала. После выполнения "Отладка-> Продолжить" три раза, выполнение программы продолжается без проблем и явных побочных эффектов. В проекте нет точек останова.
Приложение запускает другой поток при запуске, который использует класс Java DatagramSocket. Java-код работает правильно. Транспортированный код Objective-C также работает правильно, за исключением раздражающих разрывов в отладчике.
Это кадр стека при прерывании:
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>...
Локальная сборка в методе ядра pthread_kill...
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. Код метода скопирован ниже.
Для ссылки на файл, несмотря на то, что это файл Java, в него встроен код Objective-C, который сохраняется транспортером j2objc:
+ (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);
}
Попытки отладки не увенчались успехом: * Добавить и удалить точку останова "Все исключения" - при этом ничего не обнаружено * Удалить вызов closeSocket - предотвращает проблему, но, очевидно, не является решением оставить сокет открытым
1 ответ
Есть хитрость в том, чтобы попросить Xcode игнорировать сигналы. Мне любопытно, почему Xcode по умолчанию настроен на прерывание по сигналам, но все готово. Обратите внимание, что метод варьируется в зависимости от языка, который вы используете - я отредактировал его, чтобы расширить пример до Swift:
Постоянная настройка LLDB (в Xcode 4.3.2), чтобы не останавливаться на сигналах