Какая разница между кодом = 1 и кодом = 2 в EXC_BAD_ACCESS?

Я получаю код = 1 или код = 2 для ошибки EXC_BAD_ACCESS. Мне интересно, какая разница между кодом = 1 и кодом = 2?

Ответы

Ответ 1

Код = 1 - KERN_INVALID_ADDRESS, а код = 2 - KERN_PROTECTION_FAILURE. Оба объясняется в "Техническая нота TN2123 CrashReporter" :

Наиболее распространенными формами исключения являются:

  • EXC_BAD_ACCESS/KERN_INVALID_ADDRESS - это вызвано нитью доступ к памяти без памяти. Это может быть вызвано либо доступом к данным или выбор команды; раздел "Состояние темы" описывает, как скажите разницу.
  • EXC_BAD_ACCESS/KERN_PROTECTION_FAILURE - это вызванный потоком, пытающимся записать в постоянную память. Это всегда вызванный доступом к данным.

Коды определены в <mach/kern_return.h>:

#define KERN_INVALID_ADDRESS            1
                /* Specified address is not currently valid.
                 */

#define KERN_PROTECTION_FAILURE         2
                /* Specified memory is valid, but does not permit the
                 * required forms of access.
                 */

и в <mach/exception_types.h> задокументировано, что код для EXC_BAD_ACCESS есть kern_return_t:

#define EXC_BAD_ACCESS          1       /* Could not access memory */
                /* Code contains kern_return_t describing error. */
                /* Subcode contains bad memory address. */