当应用程序出现段错误时,我通常会在以下位置看到这样的消息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
手册页讨论了为段错误消息着色,而不是关于打开或关闭它们。
分段错误与 SIGSEGV 信号不同。信号只是一个信号。当您遇到实际的分段错误时,即内核将记录它,然后向您的应用程序发送一个 SIGSEGV 信号。
这背后的逻辑,以及为什么内核只记录真正的分段错误,是内核(和 CPU)是执行有关程序拥有和允许访问的地址空间的规则的东西。因此,当这些规则被打破时,它就是记录操作的人。
要正确测试,您需要在代码中实际执行一些会产生分段错误的操作,例如访问未初始化的指针。