애플리케이션 세그폴트가 발생하면 일반적으로 다음과 같은 메시지가 표시됩니다 dmesg
.
pstree[25678]: segfault at 0 ip 00007f58be0b3ae4 sp 00007ffe65b700a0 error 4 in libc-2.24.so[7f58be04d000+195000]
dmesg
그러나 더 이상 이 C 프로그램에서 segfault를 트리거 하지 않기 때문에 어딘가에서 커널 설정을 변경한 것 같습니다 .
#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
하지만 여전히 segfault 알림을 받지 못합니다. 이것dmesg
매뉴얼 페이지색상 구분 오류 메시지에 대해 논의하지만 켜거나 끄지는 않습니다.
답변1
분할 오류는 SIGSEGV 신호와 동일하지 않습니다. 신호는 신호일 뿐이다. 실제 분할 오류가 발생하면 커널은 이를 기록한 다음 SIGSEGV 신호를 애플리케이션에 보냅니다.
이에 대한 논리와 커널이 실제 분할 오류만 기록하는 이유는 커널(및 CPU)이 프로그램이 소유하고 액세스할 수 있는 주소 공간에 대한 규칙을 시행하기 때문입니다. 따라서 이러한 규칙이 위반되면 해당 작업을 기록합니다.
올바르게 테스트하려면 초기화되지 않은 포인터에 액세스하는 등 분할 오류를 생성하는 작업을 코드에서 실제로 수행해야 합니다.