in realtà un debugger non mette in pausa i programmi, è diverso..
Per fermare un programma, il debugger sovrascrive un'istruzione del programma con un codice non valido. Quando la CPU si trova ad eseguire quell'istruzione, non riuscendo a decodificare l'istruzione, scatta un interrupt di tipo Invalid Opcode. Questo interrupt viene processato tramite un jump immediato al vettore degli interrupt (che appartiene al kernel dell'OS). Una volta dentro l'interrupt handler del kernel, la richiesta viene smazzata al debugger che si occuperà di rimettere al suo posto l'istruzione originale e ti consentirà di eseguire varie operazioni sul context del processo appena interrotto (che verrà salvato in un'apposita struttura del kernel).
Questa operazione così macchinosa viene usata sia per piazzare i breakpoints, sia per fare lo stepping riga per riga. In entrambi i casi, il debugger piazzerà un'istruzione malefica nel posto corretto. Le CPU più avanzate hanno anche delle istruzioni apposite per il debugging, ma in generale è sufficiente anche usare una qualsiasi combinazione di bit che riesca a provocare un interrupt di tipo Instruction Fault, Invalid Opcode, o anche una banale syscall speciale dell'OS.
|