Alternando visibilidade das mensagens de falha de segmentação no dmesg

2

Quando os aplicativos são segmentados, 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 dmesg . Estou acionando segfaults com este programa em C:

#include <signal.h>

int main()
{
        raise(SIGSEGV);
}

Eu sei que meu nível de log é definido como KERN_DEBUG :

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

e sei que posso ver a saída em 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 man page fala sobre colorir mensagens de segfault, mas não sobre como ativá-las ou desligado.

    
por Nathaniel M. Beaver 20.02.2018 / 05:08

1 resposta

1

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 irá registrá-lo e, subseqüentemente, enviar um sinal SIGSEGV para o seu aplicativo.

A lógica por trás disso, e por que o kernel registra apenas uma falha de segmentação real, é que o kernel (e CPU) é o que reforça as regras sobre qual espaço de endereço seu programa tem e é permitido acessar. Assim, quando essas regras são quebradas, é o único a registrar 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.

    
por 20.02.2018 / 14:47