Я использую виртуальную машину для отладки ядра на Mac OS X, потому что это дешевле и удобнее, чем другой компьютер.
К сожалению, в отличие от эквивалента Windows, невозможно использовать отладчик для остановки ядра. Чтобы остановить его, нужно отправить машине немаскируемое прерывание. На физической машине это можно сделать с помощью правильных флагов отладки при загрузке, а затем удерживая обе ⌘клавиши при нажатии кнопки питания. Однако эта комбинация клавиш не может быть реализована на виртуальной машине.
Я нашелнеряшливый сценарийкоторый приостанавливает работу виртуальной машины, редактирует состояние приостановки, чтобы указать, что NMI находится в состоянии ожидания, и возобновляет ее, но это выглядит как пустая трата времени.
Можно ли отправить немаскируемое прерывание на виртуальную машину с помощью VMware Fusion?
решение1
Вы можете установить/добавить 0x4
битовый флаг к debug
аргументу переменной boot-args
через nvram
команду. Вот пример:
sudo nvram boot-args="debug=0x144 kext-dev-mode=1 kcsuffix=development pmuflags=1 -v"
Как описаноздесь, среди прочих аргументов, debug=0x4
флаг позволяет вам перейти в отладчик на NMI. Это означает, что вы можете нажать Command-Option-Control-Shift-Escape
на вашей виртуальной машине и перейти в отладчик в любое время (по какой-то причине вам также может потребоваться нажать , fn
если комбинация клавиш, указанная выше, не работает).
В конце концов, после установки точек останова, проверки памяти, вывода обратной трассировки и т. д., вам нужно будет ввести команду, continue
чтобы ядро возобновило выполнение.