Понимание кодов ошибки Набора I/O
Q: При использовании Набора I/O, как я могу выяснить то, что означают эти огромные коды ошибки?
A: Набор I/O использует ту же ошибочную схему кодирования, используемую ядром. Ошибки Набора I/O 32 бита длиной, и их тип также kern_return_t или IOReturn. Их расположение показано в Перечислении 1 (от заголовка mach/error.h).
Перечисление 1 расположение кода ошибки Набора I/O.
hi lo | system(6) | subsystem(12) | code(14) | |
Высокие 6 битов известны как системное значение, следующие 12 битов известны как значение подсистемы, и низкие 14 битов составляют код ошибки.
Первое место для поиска информации о кодах ошибки находится в заголовочном файле IOKit/IOReturn.h. Здесь Вы найдете список всех универсальных ошибок Набора I/O, которые не являются определенными для определенной семьи. Например, давайте рассмотрим ошибку Набора I/O-536870206, который в шестнадцатеричном числе является 0xE00002C2. При помощи информации в IOReturn.h, мы можем решить, что системное значение является 0x38, или sys_iokit. Значение подсистемы является 0x0, таким образом, мы знаем, что это - a sub_iokit_common ошибка. Часть кода является 0x2C2, что означает, что это - a kIOReturnBadArgument ошибка.
Существуют удобные макросы для извлечения этих трех значений от кода ошибки Набора I/O. Они показаны в Перечислении 2 (также от mach/error.h).
Ошибочные макросы экстракции перечисления 2.
#define err_get_system(err) (((err)>>26)&0x3f) #define err_get_sub(err) (((err)>>14)&0xfff) #define err_get_code(err) ((err)&0x3fff) |
Также возможно вернуть коды ошибки от Набора I/O с системным значением sys_mach_ipc, или 0x4. Наиболее распространенный из них 268435459 или шестнадцатеричный 0x10000003, который является ошибкой MACH_SEND_INVALID_DEST определенный в Kernel.framework заголовок mach/message.h. Для понимания, почему можно получить код ошибки Маха он помогает понять, что Набор I/O использует сообщения Маха для передачи между пространством пользователя и ядром. io_service_t введите передал вызовам такой как IOServiceCreatePlugInInterfaceForService определяется как mach_port_t в IOKit.framework заголовок IOTypes.h.
Так, a MACH_SEND_INVALID_DEST ошибка в этом контексте означает это a io_service_t недопустимо. Это может означать любого что io_service_t является неинициализированным или что это было ранее освобождено.
Помните, что каждая семья I/O Kit определяет свои собственные специфичные для семьи коды ошибки в различном заголовочном файле. Например, коды ошибки USB расположены в IOKit/usb/USB.h внутри Kernel.framework, в то время как большинство кодов ошибки FireWire расположено в IOKit/firewire/IOFireWireFamilyCommon.h, также внутри Kernel.framework.
История версии документа
| Дата | Примечания |
|---|---|
| 18.07.2011 | Незначительное переформатирование содержания и редакционные изменения. |
| 07.02.2002 | Новый документ, объясняющий, как интерпретировать коды ошибки Набора I/O. |