Nanosleep()系统调用唤醒时出现总线错误



我正在查看一个嵌入式MIPS Linux应用程序的核心转储。GDB正在报告SIGBUS,处理信号的线程似乎位于nanosleep的系统调用中-高级代码基本上称为sleep(verylong);假设另一个进程没有向应用程序发送该信号,是什么导致该线程像这样被唤醒?内核内部是否产生了总线错误?会不会是另一个线程阻塞了这些信号?(请原谅我的天真,我对信号不太了解)。谢谢。

如果si_pid被设置为地址,这意味着你的SIGBUS是由程序中的错误引发的。通常,当内核试图在某些程序文本中分页,但遇到IO错误时,会发生这种情况。栈溢出也会触发这个

您看到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返回并在返回地址处的代码页中分页时,您可能会遇到IO错误。

相关内容

  • 没有找到相关文章