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