Сопоставление кода ошибки IOKit IOReturn со строкой

Когда я получаю сообщение об ошибке 0x10, я хочу понять этот код ошибки. Поиск IOReturn.h и mach/error.h не особенно удобен. Я потерялся, когда получил код ошибки 0x22. Это действительно глупый вопрос, но существует ли такая функция, как error2String, которая может отображать код ошибки IOReturn в строку, описывающую ошибку?


person blacklife    schedule 08.10.2010    source источник
comment
Итак, что это был за код ошибки 0x10? (Я испытываю это прямо сейчас.) Спасибо!   -  person Greg Maletic    schedule 08.02.2011


Ответы (4)


Для этого вы можете использовать стандартную базовую функцию mach_error_string.

Например. в Свифте:

func krToString (_ kr: kern_return_t) -> String {
    if let cStr = mach_error_string(kr) {
        return String (cString: cStr)
    } else {
        return "Unknown kernel error \(kr)"
    }
}
person Colin Wilson    schedule 12.12.2019
comment
Я не знаю, почему за это не проголосовали больше. Гораздо чище, чем массивная таблица поиска - person genghiskhan; 15.05.2020
comment
Я согласен с @genghiskhan, это лучшее решение! Функция объявлена ​​в mach/mach_error.h. - person Jonas Due Vesterheden; 26.05.2020

Код, работающий в ядре, может использовать IOService::stringFromReturn(...)

person Nick Dowell    schedule 27.10.2010
comment
Документация определенно предполагает, что это правильный путь... но я совершенно не понимаю, как вызвать это из моего кода. Все, что я получаю, это символ не найденных ошибок. На что мне нужно ссылаться? Импортировать/включить? Большое спасибо. - person Greg Maletic; 08.02.2011
comment
Является ли ваш код расширением ядра или приложением/библиотекой пользовательского режима? IOService::stringFromReturn(...) (к сожалению) доступен только для кода, работающего в ядре. - person Nick Dowell; 09.02.2011

Я перенес его из IOService.h, это должно сработать.

-(NSString*)stringFromError:(unsigned int)errorVal
{
    NSDictionary *ioReturnMap =
          @{@kIOReturnSuccess:          @"success",
            @kIOReturnError:            @"general error",
            @kIOReturnNoMemory:         @"memory allocation error",
            @kIOReturnNoResources:      @"resource shortage",
            @kIOReturnIPCError:         @"Mach IPC failure",
            @kIOReturnNoDevice:         @"no such device",
            @kIOReturnNotPrivileged:    @"privilege violation",
            @kIOReturnBadArgument:      @"invalid argument",
            @kIOReturnLockedRead:       @"device is read locked",
            @kIOReturnLockedWrite:      @"device is write locked",
            @kIOReturnExclusiveAccess:  @"device is exclusive access",
            @kIOReturnBadMessageID:     @"bad IPC message ID",
            @kIOReturnUnsupported:      @"unsupported function",
            @kIOReturnVMError:          @"virtual memory error",
            @kIOReturnInternalError:    @"internal driver error",
            @kIOReturnIOError:          @"I/O error",
            @kIOReturnCannotLock:       @"cannot acquire lock",
            @kIOReturnNotOpen:          @"device is not open",
            @kIOReturnNotReadable:      @"device is not readable",
            @kIOReturnNotWritable:      @"device is not writeable",
            @kIOReturnNotAligned:       @"alignment error",
            @kIOReturnBadMedia:         @"media error",
            @kIOReturnStillOpen:        @"device is still open",
            @kIOReturnRLDError:         @"rld failure",
            @kIOReturnDMAError:         @"DMA failure",
            @kIOReturnBusy:             @"device is busy",
            @kIOReturnTimeout:          @"I/O timeout",
            @kIOReturnOffline:          @"device is offline",
            @kIOReturnNotReady:         @"device is not ready",
            @kIOReturnNotAttached:      @"device/channel is not attached",
            @kIOReturnNoChannels:       @"no DMA channels available",
            @kIOReturnNoSpace:          @"no space for data",
            @kIOReturnPortExists:       @"device port already exists",
            @kIOReturnCannotWire:       @"cannot wire physical memory",
            @kIOReturnNoInterrupt:      @"no interrupt attached",
            @kIOReturnNoFrames:         @"no DMA frames enqueued",
            @kIOReturnMessageTooLarge:  @"message is too large",
            @kIOReturnNotPermitted:     @"operation is not permitted",
            @kIOReturnNoPower:          @"device is without power",
            @kIOReturnNoMedia:          @"media is not present",
            @kIOReturnUnformattedMedia: @"media is not formatted",
            @kIOReturnUnsupportedMode:  @"unsupported mode",
            @kIOReturnUnderrun:         @"data underrun",
            @kIOReturnOverrun:          @"data overrun",
            @kIOReturnDeviceError:      @"device error",
            @kIOReturnNoCompletion:     @"no completion routine",
            @kIOReturnAborted:          @"operation was aborted",
            @kIOReturnNoBandwidth:      @"bus bandwidth would be exceeded",
            @kIOReturnNotResponding:    @"device is not responding",
            @kIOReturnInvalid:          @"unanticipated driver error",
            };

    return [ioReturnMap objectForKey:[NSNumber numberWithInt:err_get_code(errorVal)]];
}
person chuckus    schedule 01.11.2013
comment
На основании этой страницы вы вероятно, следует использовать макрос err_get_code() для извлечения кода ошибки в первую очередь. - person augurar; 31.01.2014
comment
Ответ Колина Уилсона намного лучше! Используйте mach_error_string() из mach/mach_error.h. - person Jonas Due Vesterheden; 26.05.2020

Вот версия ответа @chuckus для Swift:

func convertIOReturnToString(_ status: IOReturn) -> String? {
    let map = [
        kIOReturnSuccess:          "success",
        kIOReturnError:            "general error",
        kIOReturnNoMemory:         "memory allocation error",
        kIOReturnNoResources:      "resource shortage",
        kIOReturnIPCError:         "Mach IPC failure",
        kIOReturnNoDevice:         "no such device",
        kIOReturnNotPrivileged:    "privilege violation",
        kIOReturnBadArgument:      "invalid argument",
        kIOReturnLockedRead:       "device is read locked",
        kIOReturnLockedWrite:      "device is write locked",
        kIOReturnExclusiveAccess:  "device is exclusive access",
        kIOReturnBadMessageID:     "bad IPC message ID",
        kIOReturnUnsupported:      "unsupported function",
        kIOReturnVMError:          "virtual memory error",
        kIOReturnInternalError:    "internal driver error",
        kIOReturnIOError:          "I/O error",
        kIOReturnCannotLock:       "cannot acquire lock",
        kIOReturnNotOpen:          "device is not open",
        kIOReturnNotReadable:      "device is not readable",
        kIOReturnNotWritable:      "device is not writeable",
        kIOReturnNotAligned:       "alignment error",
        kIOReturnBadMedia:         "media error",
        kIOReturnStillOpen:        "device is still open",
        kIOReturnRLDError:         "rld failure",
        kIOReturnDMAError:         "DMA failure",
        kIOReturnBusy:             "device is busy",
        kIOReturnTimeout:          "I/O timeout",
        kIOReturnOffline:          "device is offline",
        kIOReturnNotReady:         "device is not ready",
        kIOReturnNotAttached:      "device/channel is not attached",
        kIOReturnNoChannels:       "no DMA channels available",
        kIOReturnNoSpace:          "no space for data",
        kIOReturnPortExists:       "device port already exists",
        kIOReturnCannotWire:       "cannot wire physical memory",
        kIOReturnNoInterrupt:      "no interrupt attached",
        kIOReturnNoFrames:         "no DMA frames enqueued",
        kIOReturnMessageTooLarge:  "message is too large",
        kIOReturnNotPermitted:     "operation is not permitted",
        kIOReturnNoPower:          "device is without power",
        kIOReturnNoMedia:          "media is not present",
        kIOReturnUnformattedMedia: "media is not formatted",
        kIOReturnUnsupportedMode:  "unsupported mode",
        kIOReturnUnderrun:         "data underrun",
        kIOReturnOverrun:          "data overrun",
        kIOReturnDeviceError:      "device error",
        kIOReturnNoCompletion:     "no completion routine",
        kIOReturnAborted:          "operation was aborted",
        kIOReturnNoBandwidth:      "bus bandwidth would be exceeded",
        kIOReturnNotResponding:    "device is not responding",
        kIOReturnInvalid:          "unanticipated driver error"
    ]

    return map[status]
}
person mattsven    schedule 16.09.2019