在 dmesg 中切换分段错误消息的可见性

在 dmesg 中切换分段错误消息的可见性

当应用程序出现段错误时,我通常会在以下位置看到这样的消息dmesg

pstree[25678]: segfault at 0 ip 00007f58be0b3ae4 sp 00007ffe65b700a0 error 4 in libc-2.24.so[7f58be04d000+195000]

但是,我认为我一定在某个地方更改了内核设置,因为我不再在dmesg.我用这个 C 程序触发段错误:

#include <signal.h>

int main()
{
        raise(SIGSEGV);
}

我知道我的日志级别设置为KERN_DEBUG:

$ cat /proc/sys/kernel/printk
7   4   1   7

我知道我可以看到dmesg这样的输出:

sudo sh -c "printf '<%s> Log level %s (KERN_DEBUG)\n' '7' '7' > /dev/kmsg"

我知道debug.exception-trace设置为 1:

$ sysctl debug.exception-trace 
debug.exception-trace = 1
$ cat /proc/sys/debug/exception-trace 
1

但我仍然没有收到段错误通知。这dmesg手册页讨论了对段错误消息进行着色,但没有讨论打开或关闭它们。

答案1

分段错误与 SIGSEGV 信号不同。信号只是信号。当您遇到实际的分段错误时,内核将记录它,然后向您的应用程序发送 SIGSEGV 信号。

这背后的逻辑,以及为什么内核只记录真正的分段错误,是内核(和 CPU)强制执行有关程序拥有和允许访问的地址空间的规则。因此,当这些规则被破坏时,它就会记录该操作。

为了正确测试,您需要在代码中实际执行一些会生成分段错误的操作,例如访问未初始化的指针。

相关内容