gpt4 book ai didi

linux - nanosleep() 系统调用因总线错误而醒来?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:08 38 4
gpt4 key购买 nike

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

最佳答案

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

关于linux - nanosleep() 系统调用因总线错误而醒来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7556538/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com