Debug-area unui program Terminate and Stay Resident (TSR)

Un program TSR consta din doua parti: una tranzienta si una rezidenta. Partea tranzienta are ca si sarcina incarcarea partii rezidente in RAM. Depanarea portiunii tranziente a unui astfel de TSR se face in mod obisnuit. Doar la depanarea portiunii rezidente are loc ceva nou. Iata pasii pe care trebuie sa-i urmati in procesul de debuging al programelor TSR:
1. Compileaza si linkediteaza programul TSR (eventual cu informatii de debug complete).
2. Se incarca TSR-ul in TD (Turbo Debugger) si se executa portiunea tranzienta in mod normal. Cand aceasta portiune este gata de executat, portiunea rezidenta este instalata in RAM.
3. Se seteaza un punct de intrerupere la inceputul partii rezidente (sau oriunde in portiunea rezidenta) cu ajutorul tastei F2 (sau din meniul Breakpoints).
4. Se selecteaza optiunea File | Resident din meniu pentru a face ca TD insusi sa devina rezident. Aceasta se face pentru a reveni la prompterul de DOS.
5. Odata revenirea in DOS realizata, se activeaza portiunea rezidenta.
6. Cand executia programului ajunge la breakpoint, TD revine afisand TSR-ul in punctul respectiv. In continuare se poate depana aceasta portiune (Revenirea in TD din DOS se poate face si apasand CTRL-Break de doua ori).


Ca exemplu de debug a unui program TSR, ne propunem sa facem debug la programul de redirectare de intreruperi lab8.asm care contine atat handlerul intreruperii cat si partea de instalarea a handlerului (partea tranzienta). Pentru mai multe explicatii referitoare la codul acestui program consultati textul sursa. Vom folosi ca program de testare a noii rutine de tratare a intreruperii, programul test.asm. Sa luam fiecare pas de mai sus:

1) Compilam si linkeditam programul:

Obs: Teoretic ar trebui sa mearga si daca facem din programul nostru, lab8.asm, un fisier EXE cu informatii de debug, dar mie nu mi-a reusit decat daca fac fisier COM (fara informatii de debug). De asemenea, vom compila si linkedita fisierul test.asm rezultand fisierul test.exe.

2) Incarcam TSR-ul in TD:

Obs: Desi incarc un program COM si imi apare o casuta cu mesajul "Program has no symbol table", dupa ce aleg "OK" si apas tasta F7, TD imi va afisa liniile programului meu, fara a avea insa informatii de debug.

3) Setam (cu F2) un breakpoint la inceputul partii rezidente (la inceputul handlerului):

Obs: Inceputul partii rezidente (handler) este cu aproximativ 19 linii/instructiuni mai sus decat linia pe care ne-a pozitionat tasta F7.

4) Dupa ce executam programul (pas cu pas cu F7 sau direct cu F9) si ne apare casuta cu mesajul "Resident, exit code 0", selectam din meniu optiunea File | Resident:

5) Din DOS executam programul de test al intreruperii, test.exe:

6) TD-ul va reveni afisand linia din handler (deci din portiunea rezidenta) pe care a fost setat breakpoint-ul, dupa care pot sa duc la bun sfarsit operatiunea de debug, cu tasta F7:


Obs: Debug-ul handler-ului se mai putea face scriind in codul handler-ului instructiuni de tiparire de mesaje ajutatoare (cu functia 09h, int 21h) sau scriind programul de test la sfarsitul partii de instalare a handler-ului (deci un singur program).