Что означает код 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?

Другие вопросы по тегам