А.В. Столяров - Операционная среда ОС UNIX для изучающих программирование, страница 8
Описание файла
PDF-файл из архива "А.В. Столяров - Операционная среда ОС UNIX для изучающих программирование", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 8 страницы из PDF
Î òîì, êàê èñïîëüçîâàòü ïîëó÷åííóþèíôîðìàöèþ, ðàññêàçûâàåòñÿ â 4.3.Èòàê, ÷òîáû îòêîìïèëèðîâàòü ïðîãðàììó, íàïèñàííóþ íà ÿçûêå C èöåëèêîì íàõîäÿùóþñÿ â ôàéëå prog.c, ñëåäóåò äàòü êîìàíäógcc -g -Wall prog.c -o progÏðè ýòîì ðåçóëüòàò êîìïèëÿöèè áóäåò ïîìåùåí â ôàéë prog â òåêóùåéäèðåêòîðèè.36×òîáû îòêîìïèëèðîâàòü ïðîãðàììó, ñîñòîÿùóþ èç íåñêîëüêèõ ìîäóëåé mod1.c, mod2.c, mod3.c è ãëàâíîãî ôàéëà prog.c, ñëåäóåò ñíà÷àëàîòêîìïèëèðîâàòü âñå ìîäóëè:$ gcc -g -Wall -c mod1.c$ gcc -g -Wall -c mod2.c$ gcc -g -Wall -c mod3.cè ïîëó÷èòü îáúåêòíûå ôàéëû mod1.o, mod2.o, mod3.o.
Ïîñëå ýòîãî äëÿêîìïèëÿöèè îñíîâíîãî ôàéëà è ñáîðêè ãîòîâîé ïðîãðàììû ñëåäóåò äàòüêîìàíäó$ gcc -g -Wall mod1.o mod2.o mod3.o prog.c -o prog 4.2. Îòëàä÷èê gdbÎòëàä÷èê gdb (Gnu DeBugger) ïîçâîëÿåò îòëàæèâàòü ïðîãðàììó âèíòåðàêòèâíîì ðåæèìå, ïîëüçóÿñü èíòåðôåéñîì êîìàíäíîé ñòðîêè, àòàêæå àíàëèçèðîâàòü ïðè÷èíû ñìåðòè ïðîãðàììû ïî ñîçäàííîìó ñèñòåìîé core-ôàéëó.Ó÷òèòå, ÷òî äëÿ íîðìàëüíîé ðàáîòû îòëàä÷èêà íåîáõîäèìî, ÷òîáûâñå ìîäóëè âàøåé ïðîãðàììû áûëè îòêîìïèëèðîâàíû ñ êëþ÷åì -ggdbèëè -g (ñì. 4.1).
 íåêîòîðûõ ñëó÷àÿõ íîðìàëüíîé ðàáîòå îòëàä÷èêàìîæåò ïîìåøàòü âêëþ÷åííûé ïðè êîìïèëÿöèè ðåæèì îïòèìèçàöèè, òàê÷òî ïåðåä îòëàäêîé îïòèìèçàöèþ ëó÷øå îòêëþ÷èòü. 4.2.1. Ïîøàãîâîå âûïîëíåíèå ïðîãðàììû×òîáû çàïóñòèòü îòëàä÷èê äëÿ ïðîãðàììû, èñïîëíÿåìûé ôàéë êîòîðîé íàçûâàåòñÿ prog, ñëåäóåò äàòü êîìàíäó$ gdb progÎòëàä÷èê ñîîáùèò ñâîþ âåðñèþ è íåêîòîðóþ äðóãóþ èíôîðìàöèþ, ïîñëå ÷åãî âûäàñò ïðèãëàøåíèå ñâîåé êîìàíäíîé ñòðîêè, îáû÷íî âûãëÿäÿùåå òàê: (gdb).Îñíîâíûå êîìàíäû îòëàä÷èêà:• run îñóùåñòâëÿåò çàïóñê ïðîãðàììû â îòëàäî÷íîì ðåæèìå. Ïåðåäçàïóñêîì öåëåñîîáðàçíî çàäàòü òî÷êè îñòàíîâà (ñì. íèæå). Åñëèâû çàòðóäíÿåòåñü îïðåäåëèòü, ãäå èìåííî ñëåäóåò ïðèîñòàíîâèòüâûïîëíåíèå ïðîãðàììû, ïîñòàâüòå òî÷êó îñòàíîâà íà ôóíêöèþmain();37• list ïîêàçûâàåò íà ýêðàíå íåñêîëüêî ñòðîê ïðîãðàììû, ïðåäøåñòâóþùèõ òåêóùåé è èäóùèõ íåïîñðåäñòâåííî ïîñëå òåêóùåé;• break ïîçâîëÿåò çàäàòü òî÷êó ïðèîñòàíîâêè âûïîëíåíèÿ ïðîãðàììû (breakpoint).
Òî÷êà îñòàíîâà ìîæåò áûòü çàäàíà èìåíåì ôóíêöèè, íîìåðîì ñòðîêè â òåêóùåì ôàéëå, ëèáî âûðàæåíèåì <èìÿôàéëà>:<íîìåð-ñòðîêè>, íàïðèìåð file1.c:73;• inspect ïîçâîëÿåò ïðîñìîòðåòü çíà÷åíèå ïåðåìåííîé (â òîì ÷èñëåè çàäàííîé ñëîæíûì âûðàæåíèåì âðîäå *(a[i+1].p));• backtrace èëè bt ïîêàçûâàåò òåêóùåå ñîäåðæèìîå ñòåêà, ÷òî ïîçâîëÿåò óçíàòü ïîñëåäîâàòåëüíîñòü âûçîâîâ ôóíêöèé, ïðèâåäøóþê òåêóùåìó ñîñòîÿíèþ ïðîãðàììû;• frame ïîçâîëÿåò ñäåëàòü òåêóùèì îäèí èç ôðåéìîâ, ïîêàçàííûõêîìàíäîé backtrace, ÷òî äàåò âîçìîæíîñòü èññëåäîâàòü çíà÷åíèÿïåðåìåííûõ â ýòîì ôðåéìå è ò.ï.;• step ïîçâîëÿåò âûïîëíèòü îäíó ñòðîêó ïðîãðàììû.
Åñëè â ñòðîêåñîäåðæèòñÿ âûçîâ ôóíêöèè, òåêóùåé ñòðîêîé ñòàíåò ïåðâàÿ ñòðîêà ýòîé ôóíêöèè (ò.å. ïðîöåññ òðàññèðîâêè çàéäåò âíóòðü ôóíêöèè);• next ïîäîáíà êîìàíäå step, ñ òåì îòëè÷èåì, ÷òî âõîä â òåëà âûçûâàåìûõ ôóíêöèé íå ïðîèçâîäèòñÿ;• until <íîìåð-ñòðîêè> ïîçâîëÿåò âûïîëíÿòü ïðîãðàììó äî òåõïîð, ïîêà òåêóùåé íå îêàæåòñÿ ñòðîêà ñ óêàçàííûì íîìåðîì;• call ïîçâîëÿåò âûïîëíèòü âûçîâ ïðîèçâîëüíîé ôóíêöèè;• cont ïîçâîëÿåò ïðîäîëæèòü ïðåðâàííîå âûïîëíåíèå ïðîãðàììû;• help ïîçâîëèò óçíàòü ïîäðîáíåå îá ýòèõ è äðóãèõ êîìàíäàõ îòëàä÷èêà;• quit çàâåðøàåò ðàáîòó îòëàä÷èêà (ìîæíî òàêæå âîñïîëüçîâàòüñÿêîìáèíàöèåé êëàâèø Ctrl-D).38 4.2.2. Àíàëèç ïðè÷èí àâàðèéíîãî çàâåðøåíèÿ ïî core-ôàéëó×àñòî îøèáêè â ïðîãðàììå ïðèâîäÿò ê åå àâàðèéíîìó çàâåðøåíèþ,ïðè êîòîðîì ñèñòåìà ñîçäàåò òàê íàçûâàåìûé core-ôàéë. Ïðè ýòîì âûäàåòñÿ ñîîáùåíèåSegmentation fault (core dumped)Ýòî îçíà÷àåò, ÷òî â òåêóùåé äèðåêòîðèè àâàðèéíî çàâåðøåííîãî ïðîöåññà ñîçäàí ôàéë ñ èìåíåì core (èëè prog.core, ãäå prog èìÿ âàøåéïðîãðàììû), â êîòîðûé ñèñòåìà çàïèñàëà ñîäåðæèìîå ñåãìåíòà äàííûõè ñòåêà ïðîãðàììû íà ìîìåíò åå àâàðèéíîãî çàâåðøåíèÿ.Ñ ïîìîùüþ îòëàä÷èêà gdb ìîæíî ïðîàíàëèçèðîâàòü ýòîò ôàéë,óçíàâ, â ÷àñòíîñòè, ïðè âûïîëíåíèè êàêîé ñòðîêè ïðîãðàììû ïðîèçîøëà àâàðèÿ, îòêóäà è ñ êàêèìè ïàðàìåòðàìè áûëà âûçâàíà ôóíêöèÿ,ñîäåðæàùàÿ ýòó ñòðîêó, êàêîâû áûëè çíà÷åíèÿ ïåðåìåííûõ íà ìîìåíòàâàðèè è ò.ä.×òîáû çàïóñòèòü îòëàä÷èê â ðåæèìå àíàëèçà core-ôàéëà, íåîáõîäèìî äàòü êîìàíäó:gdb prog prog.coreãäå prog èìÿ èñïîëíÿåìîãî ôàéëà âàøåé ïðîãðàììû, à prog.core èìÿ ñîçäàííîãî ñèñòåìîé core-ôàéëà13 .
Î÷åíü âàæíî ïðè ýòîì, ÷òîáûâ êà÷åñòâå èñïîëíÿåìîãî ôàéëà âûñòóïàë èìåííî òîò ôàéë, ïðè èñïîëíåíèè êîòîðîãî ïîëó÷åí core-ôàéë. Òàê, åñëè óæå ïîñëå ïîëó÷åíèÿcore-ôàéëà âû ïåðåêîìïèëèðóåòå ñâîþ ïðîãðàììó, àíàëèç core-ôàéëà âáîëüøèíñòâå ñëó÷àåâ ïðèâåäåò ê îøèáî÷íûì ðåçóëüòàòàì.Ñðàçó ïîñëå çàïóñêà îòëàä÷èêà â ðåæèìå àíàëèçà core-ôàéëà ðåêîìåíäóåòñÿ äàòü êîìàíäó backtrace (èëè ïðîñòî bt). 4.2.3. Àíàëèç ïðè÷èí çàöèêëèâàíèÿÅñëè âàø ïðîöåññ çàöèêëèëñÿ, íå òîðîïèòåñü åãî óáèâàòü. Ñ ïîìîùüþ îòëàä÷èêà ìîæíî ïîíÿòü, êàêîé ôðàãìåíò êîäà âûïîëíÿåòñÿ â íàñòîÿùèé ìîìåíò, è ïðîàíàëèçèðîâàòü ïðè÷èíû çàöèêëèâàíèÿ. Äëÿ ýòîãî íóæíî ïðèñîåäèíèòü îòëàä÷èê ê ñóùåñòâóþùåìó ïðîöåññó.
Îïðåäåëèòå íîìåð ïðîöåññà ñ ïîìîùüþ êîìàíäû ps. Äîïóñòèì, èìÿ èñïîëíÿåìîãî ôàéëà âàøåé ïðîãðàììû prog, è îíà âûïîëíÿåòñÿ êàê ïðîöåñññ íîìåðîì 12345. Òîãäà êîìàíäà çàïóñêà îòëàä÷èêà äîëæíà âûãëÿäåòüòàê:13 Ïîäîáíîå èìÿ core-ôàéëà õàðàêòåðíî äëÿ ÎÑ FreeBSD.  ÎÑ Linux ôàéë, êàêïðàâèëî, áóäåò íàçûâàòüñÿ ïðîñòî core.39gdb prog 12345Ïðè ïîäêëþ÷åíèè îòëàä÷èêà âûïîëíåíèå ïðîãðàììû áóäåò ïðèîñòàíîâëåíî, îäíàêî âû ñìîæåòå ïðè íåîáõîäèìîñòè ïðîäîëæèòü åãî êîìàíäîécont.  ñëó÷àå ïîâòîðíîãî çàöèêëèâàíèÿ ìîæíî ïðèêàçàòü îòëàä÷èêóâíîâü ïðèîñòàíîâèòü âûïîëíåíèå íàæàòèåì êîìáèíàöèè Ctrl-C. 4.3.
Ñèñòåìà àâòîìàòè÷åñêîé ñáîðêè (óòèëèòà make)Ïðè ñáîðêå âàøèõ ïðîãðàìì ìîãóò îêàçàòüñÿ ïîëåçíû âîçìîæíîñòè,ïðåäîñòàâëÿåìûå óòèëèòîé make. Êðàòêî ãîâîðÿ, ýòà óòèëèòà ïîçâîëÿåò àâòîìàòè÷åñêè ñòðîèòü îäíè ôàéëû íà îñíîâàíèè äðóãèõ (íàïðèìåð,èñïîëíÿåìûå ôàéëû íà îñíîâàíèè èñõîäíûõ òåêñòîâ ïðîãðàììû) â ñîîòâåòñòâèè ñ çàäàííûìè ïðàâèëàìè. Ïðè ýòîì make îòñëåæèâàåò äàòûïîñëåäíåé ìîäèôèêàöèè ôàéëîâ è ïðîèçâîäèò ïåðåñòðîåíèå òîëüêî òåõöåëåâûõ ôàéëîâ, äëÿ êîòîðûõ èñõîäíûå ôàéëû ïðåòåðïåëè èçìåíåíèÿ.Ñóùåñòâóåò íåñêîëüêî ðàçëè÷íûõ âåðñèé óòèëèòû make.Èçëîæåííîå â äàííîì ïàðàãðàôå ñîîòâåòñòâóåò âàðèàíòó GnuMake; èìåííî ýòîò âàðèàíò èñïîëüçóåòñÿ â áîëüøèíñòâå äèñòðèáóòèâîâ Linux. Ïðè ðàáîòå ñ ÎÑ FreeBSD äëÿ âûçîâà GnuMake íåîáõîäèìî èñïîëüçîâàòü êîìàíäó gmake âìåñòî make.
Âñëó÷àå, åñëè â ñèñòåìå òàêîé êîìàíäû íåò, îáðàòèòåñü ê ñèñòåìíîìóàäìèíèñòðàòîðó ñ ïðîñüáîé å¼ óñòàíîâèòü.Ïðàâèëà äëÿ óòèëèòû make çàäàþòñÿ â ôàéëå Makefile, êîòîðûéóòèëèòà èùåò â òåêóùåé äèðåêòîðèè. 4.3.1. Ïðîñòåéøèé MakeleÄîïóñòèì, âàøà ïðîãðàììà ñîñòîèò èç ãëàâíîãî ìîäóëÿ main.c,ñîäåðæàùåãî ôóíêöèþ main(), à òàêæå èç äîïîëíèòåëüíûõ ìîäóëåémod1.c è mod2.c, èìåþùèõ çàãîëîâî÷íûå ôàéëû mod1.h è mod2.h. Ñîîòâåòñòâåííî, äëÿ ñáîðêè èñïîëíÿåìîãî ôàéëà (íàçîâåì åãî prog) íåîáõîäèìî äàòü ñëåäóþùèå êîìàíäû:$ gcc -g -Wall -c mod1.c -o mod1.o$ gcc -g -Wall -c mod2.c -o mod2.o$ gcc -g -Wall main.c mod1.o mod2.o -o progÏåðâûå äâå êîìàíäû äàþòñÿ äëÿ êîìïèëÿöèè äîïîëíèòåëüíûõ ìîäóëåé. Ïîëó÷åííûå â ðåçóëüòàòå ôàéëû mod1.o è mod2.o èñïîëüçóþòñÿ âòðåòüåé êîìàíäå äëÿ ñáîðêè èñïîëíÿåìîãî ôàéëà.40Äîïóñòèì, ìû óæå ïðîèçâåëè êîìïèëÿöèþ ïðîãðàììû, ïîñëå ÷åãîâíåñëè èçìåíåíèÿ â ôàéë mod1.c è õîòèì ïîëó÷èòü èñïîëíÿåìûé ôàéë ñó÷åòîì âíåñåííûõ èçìåíåíèé.
Ïðè ýòîì íàì íàäî áóäåò äàòü òîëüêî äâåêîìàíäû (ïåðâóþ è òðåòüþ), ïîñêîëüêó ïåðåêîìïèëÿöèè ìîäóëÿ mod2íå òðåáóåòñÿ.×òîáû ïîäîáíûå ñèòóàöèè îòñëåæèâàëèñü àâòîìàòè÷åñêè, ìû ìîæåìèñïîëüçîâàòü óòèëèòó make. Äëÿ ýòîãî íàïèøåì ñëåäóþùèé Makefile:mod1.o: mod1.c mod1.hgcc -g -Wall -c mod1.c -o mod1.omod2.o: mod2.c mod2.hgcc -g -Wall -c mod2.c -o mod2.oprog: main.c mod1.o mod2.ogcc -g -Wall main.c mod1.o mod2.o -o progÏîÿñíèì, ÷òî ôàéë ñîñòîèò èç òàê íàçûâàåìûõ öåëåé (â íàøåì ñëó÷àå òàêèõ öåëåé òðè - mod1.o, mod2.o è prog).
Îïèñàíèå êàæäîé öåëèñîñòîèò èç çàãîëîâêà è ñïèñêà êîìàíä. Çàãîëîâîê öåëè ýòî îäíà ñòðîêà, íà÷èíàþùàÿñÿ âñåãäà ñ ïåðâîé ïîçèöèè (ò.å. ïåðåä íåé íå äîïóñêàþòñÿ ïðîáåëû è ò.ï.).  íà÷àëå ñòðîêè ïèøåòñÿ èìÿ öåëè (îáû÷íî ýòîïðîñòî èìÿ ôàéëà, êîòîðûé íåîáõîäèìî ïîñòðîèòü). Îñòàâøàÿñÿ ÷àñòüçàãîëîâêà îòäåëÿåòñÿ îò èìåíè öåëè äâîåòî÷èåì. Ïîñëå äâîåòî÷èÿ ïåðå÷èñëÿåòñÿ, îò êàêèõ ôàéëîâ (èëè, â áîëåå îáùåì ñëó÷àå, îò êàêèõ öåëåé)çàâèñèò ïîñòðîåíèå ôàéëà.  äàííîì ñëó÷àå ìû óêàçàëè, ÷òî ìîäóëè çàâèñÿò îò èõ èñõîäíûõ òåêñòîâ è çàãîëîâî÷íûõ ôàéëîâ, à èñïîëíÿåìûéôàéë îò îñíîâíîãî èñõîäíîãî ôàéëà è îò äâóõ îáúåêòíûõ ôàéëîâ.Ïîñëå ñòðîêè çàãîëîâêà èäåò ñïèñîê êîìàíä (â íàøåì ñëó÷àå âñåòðè ñïèñêà èìåþò ïî îäíîé êîìàíäå). Ñòðîêà êîìàíäû âñåãäà íà÷èíàåòñÿ ñ ñèìâîëà òàáóëÿöèè, ïðè÷åì çàìåíà òàáóëÿöèè ïðîáåëàìèíåäîïóñòèìà è âåäåò ê îøèáêå. Óòèëèòà make ñ÷èòàåò ïðèçíàêîì êîíöàñïèñêà êîìàíä ïåðâóþ ñòðîêó, íà÷èíàþùóþñÿ ñ ñèìâîëà, îòëè÷íîãî îòòàáóëÿöèè.Èìåÿ â òåêóùåé äèðåêòîðèè âûøåîïèñàííûé Makele, ìû ìîæåìäëÿ ñáîðêè íàøåé ïðîãðàììû äàòü êîìàíäó make prog. 4.3.2.
Ïåðåìåííûå ïðåäûäóùåì ïàðàãðàôå îïèñàí Makele, â êîòîðîì ìîæíî îáíàðóæèòü íåñêîëüêî ïîâòîðÿþùèõñÿ ôðàãìåíòîâ. Òàê, ñòðîêà ïàðàìåòðîâ41êîìïèëÿòîðà -g -Wall âñòðå÷àåòñÿ âî âñåõ òðåõ öåëÿõ. Ïîìèìî íåîáõîäèìîñòè ïîâòîðåíèÿ îäíîãî è òîãî æå òåêñòà, ìû ìîæåì ñòîëêíóòüñÿñ ïðîáëåìàìè ïðè ìîäèôèêàöèè.
Ïðåäïîëîæèì, íàì ïîíàäîáèòñÿ çàäàòü êîìïèëÿòîðó ðåæèì îïòèìèçàöèè êîäà (ôëàã -O2). Äëÿ ýòîãî íàìïðèøëîñü áû âíåñòè ñîâåðøåííî îäèíàêîâûå èçìåíåíèÿ â òðè ðàçíûåñòðîêè ôàéëà.  áîëåå ñëîæíîì ñëó÷àå òàêèõ ñòðîê ìîæåò ïîíàäîáèòüñÿ íåñêîëüêî äåñÿòêîâ è äàæå ñîòåí.Àíàëîãè÷íàÿ ïðîáëåìà âñòàíåò, íàïðèìåð, åñëè ìû çàõîòèì ïðîèçâåñòè ñáîðêó äðóãèì êîìïèëÿòîðîì.Ðåøèòü ïðîáëåìó ïîçâîëÿåò ââåäåíèå make-ïåðåìåííûõ.