Ëåêöèÿ 11


Îòëàä÷èê


4 ñïîñîáà îòëàäêè ïðîãðàììû:

1) Ìåòîä ïðèñòàëüíîãî âçãëÿäà

2) Îòëàäî÷íàÿ ïå÷àòü

3) Îòëàä÷èê

4*) Ñèíòåòè÷åñêèé: àíàëèç, ìåòîä äåëåíèÿ ïîïîëàì


Ëèíóêñ gdb – Gnu DeBugger

GNU – GNU Not Unix


Ïî÷åìó è êîãäà ìîæåò çàõîòåòüñÿ âîñïîëüçîâàòüñÿ îòëàä÷èêîì:


1. Ïðîãðàììà ïàäàåò ñ äèàãíîñòèêîé:
a) Floating point exception. Ïðè÷èíû:

  1. Äåëåíèå íà íîëü

  2. Èñïîëüçîâàíèå çíà÷åíèé íåèíèöèàëèçèðîâàííûõ ïåðåìåííûõ (íå ïðèñâîåíî çíà÷åíèå)






b) Segmentation Fault:




gcc tmp11_2.c -g => gdb ./a.exe =>




Ctrl+x, Ctrl+a (Ctrl+{x, a}) =>






2. Ïðîãðàììà ðàáîòàåò íå òàê, êàê îò íåå îæèäàþò:


(íåò âûâîäà ar[0])







3. Ïðîãðàììà çàöèêëèâàåòñÿ: Îñòàíîâêà çàöèêëèâøåéñÿ ïðîãðàììû ïðè ïîìîùè Ctrl+C ïîìîãàåò îïðåäåëèòü, â êàêîì öèêëå îíà çàñòðÿëà.




4*. Ïðîãðàììà ðàáîòàåò ìåäëåííî. Ïðåðûâàíèå ïðîãðàììû, ðàáîòàþùåé ïîä îòëàä÷èêîì, ïîìîãàåò îïðåäåëèòü, â êàêîé ÷àñòè êîäà îíà íàõîäèòñÿ áîëüøå âñåãî âðåìåíè (ñðåäñòâî profile – áîëåå ýôôåêòèâíî)



Êàê ïîëüçîâàòüñÿ gdb


1. Ñêîìïèëèðîâàòü ïðîãðàììó ñ îòëàäî÷íîé èíôîðìàöèåé: ñ êëþ÷îì ”-g”

Ïðèìåð: gcc tmp.c -g

Ôàéë a.out (â cygwin a.exe) â ðåçóëüòàòå òàêîé êîìïèëÿöèè áóäåò ñîäåðæàòü îòëàäî÷íóþ èíôîðìàöèÿ (íàïðèìåð, õðàíÿòñÿ èìåíà ôóíêöèé, ïåðåìåííûõ, ñîîòâåòñòâèå êîìàíä C ìàøèííûì èíñòðóêöèÿì).


tmp.c (èñõîäíûé êîä íà ÿçûêå C, â âèäå òåêñòà)

|

| (ïðîöåññ êîìïèëÿöèè)

V

tmp.o (îáúåêòíûé ôàéë - ìàøèííûå èíñòðóêöèè, ñîîòâåòñòâóþùèå èñõîäíîìó êîäó, â áèíàðíîì âèäå)

|

| (ïðîöåññ ñâÿçûâàíèÿ — ðàçðåøåíèå âíåøíèõ ññûëîê, íàïðèìåð, íà ôóíêöèè ââîäà/âûâîäà)

V

a.out (a.exe) (çàãðóçî÷íûé, èëè âûïîëíÿåìûé ôàéë, ñîäåðæèò ìàøèííûå èíñòðóêöèè, â áèíàðíîì âèäå)



2. gdb <èìÿ çàãðóçî÷íîãî ôàéë> - íà÷àòü îòëàäêó çàãðóçî÷íîãî ôàéëà <èìÿ çàãðóçî÷íîãî ôàéëà>

Ïðèìåð. gdb ./a.exe (íà Ëèíóêñå gdb ./a.out)


3. Ââîä êîìàíä îòëàä÷èêà






Êîìàíäû îòëàä÷èêà


a) run – çàïóñòèòü ïðîãðàììó (íà÷àòü âûïîëíåíèå)

b) print <èìÿ ïåðåìåííîé> - íàïå÷àòàòü çíà÷åíèå ïåðåìåííîé <èìÿ ïåðåìåííîé>

c) breakpoint <èìÿ ôóíêöèè>/<íîìåð ñòðîêè> - óñòàíîâèòü òî÷êó ïðåðûâàíèÿ (îñòàíîâà, ïàóçû) íà íà÷àëî ôóíêöèè <èìÿ ôóíêöèè> èëè íà ñòðîêó ñ íîìåðîì <íîìåð ñòðîêè>

d*) watchpoint <èìÿ ïåðåìåííîé> - óñòàíîâèòü ïðåðûâàíèå ïðè èçìåíåíèè çíà÷åíèÿ ïåðåìåííîé <èìÿ ïåðåìåííîé>

d) continue – ïðîäîëæèòü âûïîëíåíèå ïðîãðàììû (íàïðèìåð, ïîñëå îñòàíîâêè íà òî÷êå ïðåðûâàíèÿ èëè ïîñëå îñòàíîâêè ïðè ïîìîùè Ctrl+C)

e) disable <íîìåð òî÷êè ïðåðûâàíèÿ> - îòìåíèòü òî÷êó ïðåðûâàíèÿ (ñäåëàòü íåäåéñòâóþùåé)

f) next – âûïîëíèòü òåêóùóþ èíñòðóêöèþ (íå çàõîäèò â âûçûâàåìóþ ôóíêöèþ)

g) step – âûïîëíèòü òåêóùóþ èíñòðóêöèþ è çàéòè âíóòðü âûçûâàåìîé ôóíêöèè

i*) Âêëþ÷èòü/âûêëþ÷èòü âèçóàëèçàöèþ èñõîäíîãî òåêñòà ïðîãðàììû: Ctrl+x, Ctrl+a

j) quit – âûéòè èç îòëàä÷èêà (”y” – äà/”n” - íåò)