dialog, trap e SIGTRAP

5

Eu vi muitos exemplos usando ferramentas de diálogo em scripts com linhas da seguinte forma:

trap "rm $datafile" 0 1 2 5 15

O que eu não entendo é o significado do SINAL 5, ok eu sei é SIGTRAP. Mas que vergonha para mim, ainda não entendi seu real significado ...

Obrigado antecipadamente !!

    
por sebelk 20.05.2014 / 01:54

2 respostas

6

Há uma página de manual signal(7) :

Signal         Value   Action   Comment
SIGTRAP        5        Core    Trace/breakpoint trap

Este sinal (como sugere a página de manual) é usado principalmente pelas ferramentas de depuração como gdb ou strace , respectivamente, a chamada de sistema ptrace(2) . Se um processo estiver rastreando a atividade de outro processo através de ptrace(2) , SIGTRAP será strongmente usado para interromper a criança, mesmo que a criança na maioria dos casos não saiba efetivamente que isso aconteceu (um processo monitorado através de ptrace(2) faz não necessariamente perceber qual sinal foi enviado a ele, porque o rastreador pode interceptar e filtrar os sinais entregues e SIGTRAP serve principalmente para informar ao rastreador que algo perceptível aconteceu.

Observar a% man_de% manpage é muito esclarecedor nesse caso.

    
por 20.05.2014 / 02:15
1

I don't understand its real significance

Vamos ver como isso é causado e usado.

A principal causa do SIGTRAP é a instrução int3 .

Podemos verificar isso com:

int main() {
    asm("int3");
    return 0;
}

que quando executa as saídas:

Trace/breakpoint trap (core dumped)

e tem status de saída 133 = 128 + 5, assim sinal 5, SIGTRAP.

O GDB insere a instrução int3 no segmento de texto, configura ptrace e permite a execução do programa. Quando atinge int3 , ptrace acorda o pai que pode monitorar o estado da criança.

Observe que também há pontos de interrupção de hardware, que possuem um mecanismo diferente: Qual é a diferença entre os pontos de interrupção de hardware e software? | Estouro de pilha

Mais sobre o int3

int3 tem duas codificações:

  • o prefixo int normal + 3 que ocupa 2 bytes, int 3 em NASM
  • uma codificação especial de 1 byte longa, int3 em NASM

A codificação longa de um byte é fundamental para o GDB. Se a instrução fosse maior que 1 byte, poderia sobrescrever várias instruções, o que seria confuso.

    
por 05.08.2015 / 17:18