Quando os aplicativos segfault, geralmente vejo mensagens como esta em dmesg
:
pstree[25678]: segfault at 0 ip 00007f58be0b3ae4 sp 00007ffe65b700a0 error 4 in libc-2.24.so[7f58be04d000+195000]
No entanto, acho que de alguma forma devo ter alterado minhas configurações de kernel em algum lugar, porque não vejo mais essas mensagens em arquivos dmesg
. Estou acionando segfaults com este programa C:
#include <signal.h>
int main()
{
raise(SIGSEGV);
}
Eu sei que meu loglevel está definido em KERN_DEBUG
:
$ cat /proc/sys/kernel/printk
7 4 1 7
e sei que posso ver a saída dmesg
assim:
sudo sh -c "printf '<%s> Log level %s (KERN_DEBUG)\n' '7' '7' > /dev/kmsg"
e eu sei que debug.exception-trace
está definido como 1:
$ sysctl debug.exception-trace
debug.exception-trace = 1
$ cat /proc/sys/debug/exception-trace
1
mas ainda não recebo notificações de segfault. A dmesg
página de manual fala sobre colorir mensagens de falha de segmentação, mas não sobre ativá-las ou desativá-las.
Uma falha de segmentação não é a mesma coisa que um sinal SIGSEGV. Um sinal é apenas um sinal. Quando você tem uma falha de segmentação real, é quando o kernel a registra e, subsequentemente, envia um sinal SIGSEGV para seu aplicativo.
A lógica por trás disso, e por que o kernel apenas registra uma falha de segmentação real, é que o kernel (e a CPU) é o que impõe as regras sobre qual espaço de endereço seu programa tem e tem permissão para acessar. Assim, quando essas regras são quebradas, é ele quem registra a ação.
Para testar corretamente, você precisa realmente fazer algo em seu código que gere uma falha de segmentação, como acessar um ponteiro não inicializado.