Что означает код EXC_BREAKPOINT и субкод?
Обычно, когда я устанавливаю контрольные точки lldb, когда они достигаются, lldb говорит, что контрольная точка достигла старого значения: нового значения. Тем не менее, я установил точку наблюдения для адреса, который, кажется, записывается внутри сторонней библиотеки (libjpeg-turbo), и вместо обычного попадания в точку наблюдения я вижу EXC_BREAKPOINT code=258, subcode=0xADDRESS.
Во всех случаях я вижу, что субкод должен быть адресом, так как он всегда равен адресу или близок к тому, на который я установил точку наблюдения. Кто-нибудь может это подтвердить?
Если я удалю точку наблюдения и продолжу движение, lldb не остановится с EXC_BREAKPOINT. Но что означает код и где я могу найти официальную документацию по этому вопросу?
Exc_types.h не дает никакой подробной информации об этом.
2 ответа
Для тех, кто интересуется этим вопросом, есть хорошая статья на эту тему:
Понимание типов исключений iOS
Во всех случаях я вижу, что субкод должен быть адресом, так как он всегда равен адресу или близок к тому, на который я установил точку наблюдения. Кто-нибудь может это подтвердить?
Там не так много информации в exception_types.h
заголовки:
open -t /Applications/Xcode.app//Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include/mach/exception_types.h
Я могу подтвердить, что я всегда вижу EXC_BREAKPOINT
иметь адрес в субкоде.
Однако другие типы в заголовке говорят, что subcode
может иметь различную информацию:
#define EXC_EMULATION 4 /* Emulation instruction */
/* Emulation support instruction encountered */
/* Details in code and subcode fields */
Мы должны были расследовать одну аварию Swift, которая произвела: EXC_BREAKPOINT
, В нашем случае это сводилось к принуждениям типа Swift. Обе следующие причины EXC_BREAKPOINT
на устройствах ARM:
func test_crash() {
let num = Int(DBL_MAX)
}
func test_crash_2() {
let num = Int(Double(0) / Double(0))
}
В обоих этих случаях EXC_BREAKPOINT имеет субкод с адресом, который является адресом sbrk
инструкция, если вы посмотрите на сборку.
exc_types.h имеет только независимые от архитектуры части определений исключений. Вам нужно заглянуть в подкаталоги i386/arm, чтобы найти детали, относящиеся к архитектуре. Если вы находитесь на Yosemite, каталог arm не будет находиться в / usr / include / mach, вам придется искать его в iPhoneOS SDK внутри Xcode.app. В любом случае, mach/arm/exception.h говорит:
#define EXC_ARM_DA_DEBUG 0x102 /* Debug (watch/break) Fault */
И, как вы подозреваете, субкод является адресом доступа.
Но lldb не сообщает голых исключений, если распознает исключение как реализацию задачи более высокого уровня. В этом случае следует сообщать причину остановки как попадание в точку наблюдения. По какой-то причине он не распознает это как вашу точку наблюдения. Адрес субкода в точности совпадает с адресом, сообщенным watch list
?