Memory management 在崩溃之前查看调用了什么内核函数的方法?

Memory management 在崩溃之前查看调用了什么内核函数的方法?,memory-management,linux-kernel,Memory Management,Linux Kernel,我想看看在执行以下操作时调用了什么内核函数: int main(void) { int arr[5] = {0}; arr[3000] = 8; // I want to see what kernel function sends the SIGBUS } 有没有一种方法可以使用gdb或其他工具来实现这一点?我不确定这一调用序列是否特定于arch,但对于arm: do_page_fault -> __do_user_fault -> force_sig_info.

我想看看在执行以下操作时调用了什么内核函数:

int main(void)
{
    int arr[5] = {0};
    arr[3000] = 8; // I want to see what kernel function sends the SIGBUS
}

有没有一种方法可以使用gdb或其他工具来实现这一点?

我不确定这一调用序列是否特定于arch,但对于arm:

do_page_fault -> __do_user_fault -> force_sig_info.
您不能通过gdb进行检查,因为它是一个内核。如果您想了解更多信息,请使用dump_stack()/printk/ftrace内核API。
顺便说一句,-这段代码是否会得到异常信号并不明显…

好吧,你不能保证得到信号。这是一种未定义的行为,所以任何事情都可能发生,包括什么都不可能发生。虽然你不应该指望这种崩溃,但它很可能发生在今天的系统上。如果堆栈向下增长,则远远超出阵列末端的访问可能位于堆栈的原始地址之上,并且在为其映射的页面之外,因此可能触发错误,除非属于该进程的其他页面映射到该地址。如果您打印出一些指针并进入睡眠状态,您可以在/proc中查看进程的页面映射,当我这样做时,我会看到堆栈映射和下一个堆栈映射之间存在差距,可能是为了捕捉这种情况。