Системный вызов nanosleep() просыпается с ошибкой шины?

Я смотрю на дамп ядра из встроенного приложения MIPS Linux. GDB сообщает о SIGBUS, и поток, обрабатывающий сигнал, кажется, находится в системном вызове для nanosleep - код более высокого уровня, в основном называемый sleep(очень долгое время); Предполагая, что другой процесс не отправил этот сигнал приложению, что могло бы вызвать пробуждение этого потока следующим образом? Что-то внутри ядра вызвало ошибку шины? Может ли это быть вызвано другим потоком, который блокирует такие сигналы? (прошу прощения за любую наивность здесь, я не слишком осведомлен о сигналах). Благодарю.

1 ответ

Решение

Если si_pid установлен на адрес, это означает, что ваш SIGBUS был вызван ошибкой в ​​программе. Обычно это происходит, когда ядро ​​пытается листать текст программы, но сталкивается с ошибкой ввода-вывода. Переполнение стека также может вызвать это.

Ты видишь si_pid установить адрес, потому что si_pid является частью союза, и псевдоним с si_address, Особенно, si_pid действует только если si_code == SI_USER, Вы можете получить больше информации от si_code член:

   The following values can be placed in si_code for a SIGBUS signal:

       BUS_ADRALN     invalid address alignment

       BUS_ADRERR     nonexistent physical address

       BUS_OBJERR     object-specific hardware error

       BUS_MCEERR_AR (since Linux 2.6.32)
                      Hardware memory error consumed on a machine check; action required.

       BUS_MCEERR_AO (since Linux 2.6.32)
                      Hardware memory error detected in process but not consumed; action optional.

Обратите внимание, что невозможно заблокировать исходящие от ядра сигналы SIGBUS - если вы попытаетесь это сделать, ваша программа все равно будет прервана.

Я подозреваю, что ваш отладчик может быть немного сбит с толку относительно происхождения сигнала SIGBUS здесь; это может быть связано с неправильной темой. Возможно, вы захотите изучить другие потоки вашего процесса, чтобы увидеть, делают ли они что-то странное. Кроме того, вы могли столкнуться с ошибкой ввода-вывода при возврате из nanosleep и пейджинг на странице кода по обратному адресу.

Другие вопросы по тегам