Ïðèìåð èñïîëüçîâàíèÿ îòëàä÷èêà GDB

Îòëàä÷èê GDB ðàáîòàåò ïîä îïåðàöèîííûìè ñèñòåìàìè Linux è Mac OS.

 OS Windows ìîæíî óñòàíîâèòü ïðèëîæåíèå cygwin, âêëþ÷èâ ïðè åãî óñòàíîâêå ïðîãðàììû gcc (g++) è gdb.


Ðàçáèðàåìñÿ ñ ïðîáëåìîé: ïðîãðàììà ïàäàåò ñ ñîîáùåíèåì "Aborted (core dumped)":



Åñëè ïðîãðàììà ïàäàåò (àâàðèéíî ïðåêðàùàåò ðàáîòó, íå äîéäÿ äî êîíöà), òî èìåííî îòëàä÷èê ëó÷øå âñåãî ïîìîæåò íàéòè ìåñòî ïàäåíèÿ.

Äëÿ çàïóñêà ïðîãðàììû ïîä îòëàä÷èêîì íàäî ñêîìïèëèðîâàòü èñõîäíûå òåêñòû ñ êëþ÷îì "-g", à çàòåì çàïóñòèòü åå ïîä îòëàä÷èêîì è âûïîëíèòü êîìàíäó "run" (ýòà êîìàíäà íà ñêðèíøîòå íàáðàíà, íî åùå íå âûïîëíåíà):



Ïîñëå âûïîëíåíèÿ êîìàíäû "run" è ïàäåíèÿ ïðîãðàììû íóæíî âûïîëíèòü êîìàíäó "bt", ÷òîáû óâèäåòü ñòåê âûçîâîâ ôóíêöèé. Íà ñêðèíøîòå íèæå âèäíî, ïðîãðàììà óïàëà ïðè âûïîëíåíèè ôóíêöèè ~List(), êîòîðàÿ íàõîäèòñÿ íà 11-ì óðîâíå ñòåêà âûçîâîâ (ôóíêöèè íà óðîâíÿõ 0-10 ñèñòåìíûå èëè áèáëèîòå÷íûå, òàê ÷òî ïðîáëåìà òî÷íî íå â íèõ). Êîìàíäîé "frame 11" ïåðåõîäèì íà ýòîò óðîâåíü:



Ïåðåõîäèì â ðåæèì âèçóàëèçàöèè èñõîäíîãî êîäà ïðè ïîìîùè êîìàíä Ctrl+X è Ctrl+A (âûïîëíåííûõ ïîñëåäîâàòåëüíî):



Âèäíî, ÷òî ïðîãðàììà óïàëà ïðè îñâîáîæäåíèè ïàìÿòè, çàõâà÷åííîé äëÿ ìàññèâà arrayLink.

Î÷åâèäíî, ïðîãðàììà ÷òî-òî ïèñàëà â ÿ÷åéêè ïàìÿòè, ðàñïîëîæåííûå ðÿäîì ñ ýòèì ìàññèâîì. Íàèáîëåå ÷àñòàÿ îøèáêà â ïðîãðàììå - çàïèñü â ýëåìåíòû ìàññèâà ñ èíäåêñàìè -1 èëè N, ãäå N - ðàçìåð ìàññèâà. Çàïèñü "ìèìî" çàõâà÷åííîé ïàìÿòè íåäîïóñòèìà. Îïåðàöèîííàÿ ñèñòåìà ïðîâåðÿåò ñîäåðæèìîå ÿ÷ååê âîêðóã îñâîáîæäàåìîé ïàìÿòè è â ñëó÷àå îáíàðóæåíèÿ ïîâðåæäåíèé ñîäåðæèìîãî ýòèõ ÿ÷ååê òåðìèíèðóåò ïðîãðàììó.


Ïðåäïîëîæèì ñíà÷àëà, ÷òî ïðîãðàììà ïèñàëà â ÿ÷åéêó ñ èíäåêñîì -1.

Äëÿ îòñëåæèâàíèÿ ýòîãî äåéñòâèÿ ïîñòàâèì òî÷êó ïðåðûâàíèÿ íà âûçîâå êîíñòðóêòîðà (ñòðîêà 99), â êîòîðîì çàõâàòûâàëàñü ïàìÿòü, è âûïîëíèì ïðîãðàììó ñíà÷àëà (êîìàíäà "run"). Åñëè êàðòèíêà èñõîäíîãî êîäà ñáèëàñü, âûêëþ÷àåì ðåæèì âèçóàëèçàöèè èñõîäíîãî êîäà, à çàòåì ñíîâà âêëþ÷àåì (äâà ðàçà âûïîëíÿåì êîìàíäû Ctrl+X è Ctrl+A).



Êîãäà ïðîãðàììà îñòàíîâèòñÿ íà ñòðîêå 99, ïðîéäåì âíóòðü êîíñòðóêòîðà êîìàíäîé "step":



Îêàçàâøèñü â êîíñòðóêòîðå, âûïîëíèì åùå òðè îïåðàòîðà (êîìàíäîé "next"), ÷òîáû çàõâàòèëàñü ïàìÿòü ïîä arrayLink è òàêèì îáðàçîì ñòàë èçâåñòåí àäðåñ ìàññèâà.

Ïîñëå ýòîãî âûâåäåì íà ïå÷àòü àäðåñ ýëåìåíòà arrayLink ñ èíäåêñîì -1 è óñòàíîâèì ïðåðûâàíèå íà çàïèñü ïî ýòîìó àäðåñó (êîìàíäà "watch ..."):




Ïîñëå ýòîãî ïðîäîëæèì âûïîëíåíèå ïðîãðàììû (êîìàíäîé "continue"):




Ìû âèäèì, ÷òî â ñòðîêå 177 â ýëåìåíò ñ èíäåêñîì k áûëî çàïèñàíî ÷èñëî (-2). Ïðîâåðÿåì, ÷òî k == 2 (ïå÷àòàåì çíà÷åíèå k êîìàíäîé "print k") è âèäèì, ÷òî äåéñòâèòåëüíî â ýëåìåíò ìàññèâà arrayLink ñ èíäåêñîì -1 áûëî çàïèñàíî ÷èñëî, ÷òî è âûçâàëî ïðåðûâàíèå âûïîëíåíèÿ ïðîãðàììû, êîòîðîå ìû çàêàçûâàëè.


Òåïåðü ìîæíî íàïå÷àòàòü ñîäåðæèìîå ìàññèâà (êîìàíäà "print *arrayLink@3", ãäå 3 - ðàçìåð ìàññèâà) è ðàçáèðàòüñÿ, êàê èíäåêñ k îêàçàëñÿ ðàâåí -1.