1

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

4

1 回答 1

3

如果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 错误。

于 2011-09-26T20:48:09.370 回答