Если для адреса 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
и переходом на страницу кода по адресу возврата.