Что означает код возврата ядра macOS 0x1000000C (MACH_SEND_INVALID_MEMORY)?

 
Предыдущий Следующий
MACH_SEND_INVALID_NOTIFY MACH_SEND_NO_BUFFER

MACH_SEND_INVALID_MEMORY

Внестрочная память оказалась непригодной

MACH_SEND_INVALID_MEMORY возникает, когда тело сообщения описывает внестрочную память, недоступную отправителю для чтения в момент отправки. Адрес может быть недопустимым, неотображённым, защищённым от требуемого доступа либо использоваться с размером и сочетанием дескрипторов, которые не задают допустимый диапазон. Результат относится к телу сообщения, а не только к буферу заголовка.

Внестрочные дескрипторы привлекательны тем, что Mach может эффективно передавать большие области с помощью механизмов виртуальной памяти. Одновременно они делают важными правила времени жизни: приложение должно сохранять память действительной, пока отправка не вернёт результат, определяющий владение. Интерфейс относит этот результат к случаям, когда сообщение могло быть частично или полностью уничтожено, поэтому безопаснее сформировать запрос заново, чем предполагать, что дескрипторы сохранились.

Как исследовать

  • Проверьте адрес, длину, защиту и время жизни выделения для каждого внестрочного дескриптора.
  • Убедитесь, что другой поток не удалил область из карты, не использовал её повторно и не изменил защиту во время формирования запроса.
  • При использовании параметров освобождения и копирования дескриптора явно учитывайте владение данными.
  • Сократите неудачное сообщение до одного дескриптора и проверьте структуру ABI, прежде чем исследовать гипотезы о нехватке ресурсов ядра.

Ссылки


Нужно найти другой код? Найти другой код состояния или ошибки.