当应用程序出现段错误时,我通常会在以下位置看到这样的消息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)强制执行有关程序拥有和允许访问的地址空间的规则。因此,当这些规则被破坏时,它就会记录该操作。
为了正确测试,您需要在代码中实际执行一些会生成分段错误的操作,例如访问未初始化的指针。