dialog, trap și SIGTRAP (Unix, Bash, Capcană, Dialog, Sigtrap)

sebelk a intrebat.

Am văzut o mulțime de exemple care folosesc instrumente de dialog în scripturi cu linii ca următoarele:

trap "rm $datafile" 0 1 2 5 15

Ceea ce nu înțeleg este semnificația lui SIGNAL 5, ok știu că este SIGTRAP. Dar să-mi fie rușine, tot nu-i înțeleg adevărata semnificație…

Mulțumesc anticipat!!!

Comentarii

  • Nu mai are nicio semnificație acum – se pare că a fost refolosit din scripturi foarte vechi care funcționau în jurul unei implementări buggy a shell-ului pe Solaris. O alegere mai bună ar fi semnalul 3. –  > Por Thomas Dickey.
2 răspunsuri
Andreas Wiese

Există o pagină de manual signal(7):

Signal         Value   Action   Comment
SIGTRAP        5        Core    Trace/breakpoint trap

Acest semnal (după cum sugerează pagina de manual) este utilizat în principal de instrumente de depanare precum gdb sau strace, , respectiv ptrace(2) apel de sistem. Dacă un proces urmărește activitatea unui alt proces prin intermediul lui ptrace(2), , SIGTRAP va fi foarte mult folosit pentru a „întrerupe” copilul, chiar dacă acesta, în majoritatea cazurilor, nu va ști efectiv că acest lucru s-a întâmplat (un proces monitorizat prin ptrace(2) nu observă neapărat ce semnal i-a fost trimis, din cauza faptului că urmăritorul este capabil să intercepteze și să filtreze semnalele transmise și SIGTRAP servește în primul rând pentru a informa trasorul că s-a întâmplat ceva notabil).

Dacă ne uităm la ptrace(2) pagina de manual este foarte lămuritoare în acest caz.

Ciro Santilli新疆棉花TRUMP BAN BAD

Nu înțeleg semnificația sa reală

Să vedem cum este cauzat și folosit.

Cauza majoră a SIGTRAP este reprezentată de int3 instrucțiunea.

Putem verifica acest lucru cu:

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

care atunci când este executată produce:

Trace/breakpoint trap (core dumped)

și are starea de ieșire 133 = 128 + 5, deci semnalul 5, SIGTRAP.

GDB inserează int3 instrucțiunea în segmentul de text, setează ptrace, , și lasă programul să ruleze. Atunci când atinge int3, , ptrace se trezește părintele care poate monitoriza starea copilului.

Rețineți că există și puncte de întrerupere hardware, care au un mecanism diferit: Care este diferența dintre punctele de întrerupere hardware și software? | Stack Overflow

Mai multe despre int3

int3 are două codificări:

  • cea obișnuită int prefix + 3 care ocupă 2 octeți, int 3 în NASM
  • o codificare specială cu o lungime de 1 octet, int3 în NASM

Codificarea lungă de un octet este fundamentală pentru GDB. Dacă instrucțiunea ar avea o dimensiune mai mare de 1 octet, ar putea suprascrie mai multe instrucțiuni, ceea ce ar fi un dezastru.

user273376