[ Pobierz całość w formacie PDF ]
.Pozakoñczeniu analizy, mo¿na pozwoliæ programowi na jego dalsze, ju¿ samodzielne,dzia³anie przy pomocy polecenia dettach.To uwalnia pochwycony proces, którynastêpnie przebiega jak poprzednio.(gdb) detachDetaching from program: /home/neil/PliP/chapter/debug, Pid 1943(gdb) quit$Inne w³aœciwoœci GDBGDB, podobnie jak i inne programy uruchomieniowe, mo¿na u¿yæ do zakoñczonegokrachem programu, o ile dokona³ zrzutu pamiêci (ang.core dump).To pozwoli nainspekcjê zawartoœci globalnych struktur danych w momencie, kiedy aplikacjazakoñczy³a siê nienaturalnie.W tym celu uruchamia siê GDB poleceniem:$ gdb aplikacja coreW obrêbie sesji GDB mo¿na wywo³aæ dowoln¹ funkcjê z aplikacji lub u¿ywanychbibliotek.Wystarczy podaæ polecenie call wraz z poprawn¹ funkcj¹ jêzyka C jakoargumentem.(gdb) call printf("witaj\n")witaj$2 = 5(gdb) call dumptrace()0:./backtrace.so(dumptrace+0x12) [0x40015322].GDB umo¿liwi ustawienie kontrolnych punktów zmian (ang.watchpoints), które s¹typem punktów kontrolnych, reaguj¹cych na zmianê wartoœci wyra¿enia.Spowodujeto spowolnienie wykonywania, ale mo¿e okazaæ ko³em ratunkowym w trudnejsytuacji.Wiêcej szczegó³Ã³w na ten temat mo¿na znaleŸæ w dokumentacji GDB lubkorzystaj¹c z pomocy online.ZasobyJest wiele innych narzêdzi, sztuczek i wskazówek wykorzystywanych przezdoœwiadczonych programistów — nie mo¿emy ich jednak omówiæ w ¿aden sposób zuwagi na brak miejsca.Poni¿ej znaleŸæ mo¿na kilka sugestii, które uznaliœmy zau¿yteczne.Narzêdzie strace drukuje wszystkie wywo³ania systemowe, jakie program realizujew trakcie swojego przebiegu.Mo¿e równie¿ zapisaæ sygna³y, które aplikacjaotrzymuje.Bywa to wyj¹tkowo po¿yteczne w tropieniu problemów z plikami jako,¿e s¹ pokazywane wszystkie operacje niskiego poziomu otwierania, odczytu izapisu.Inne systemy typu UNIX maj¹ podobne narzêdzia — systemy oparte na BSDdysponuj¹ ktrace, zaœ Solaris posiada truss i sotruss.Funkcja biblioteczna mo¿e byæ podmieniona inn¹ funkcj¹, w³asnego pomys³u —która byæ mo¿e zapisuje wiêcej informacji o swoich operacjach.Tak czêsto czynisiê z procedurami alokacji pamiêci, malloc() i jej podobnymi.Jest wieledostêpnych sposobów podmiany, które pomagaj¹ wytropiæ problemy z pamiêci¹.Niektóre z nich s¹ omówione w rozdziale 11.Linux udostêpnia kod Ÿród³owy systemu, a zatem mo¿na nawet zbudowaæ w³asn¹wersjê kompletnej biblioteki jêzyka C.Wystarczy tylko tego zapragn¹æ!Jeœli aplikacja mo¿e dzia³aæ poprzez sieæ, to uruchomienie jej wraz z aktywnym„czujnikiem” ruchu w sieci mo¿e byæ pomocne.Programy takie jak tcpdumprejestruj¹ pakiety, przechodz¹ce przez sieæ.Co wiêcej, takie programy mog¹ byæskonfigurowane do zapisu jedynie okreœlonych typów wymiany.U¿ycie komunikacyjnej us³ugi sieciowej, telnet, na odpowiednim porcie czêstoumo¿liwia dostêp do aplikacji, takich jak serwery WWW, które nas³uchuj¹po³¹czeñ sieciowych na porcie TCP.Takie podejœcie pomaga niezale¿nie sprawdziædzia³ania aplikacji serwera i klienta.Narzêdzia okreœlaj¹ce wydajnoœæ, takie jak top czy narzêdzia do administrowaniasystemem — jak lsof, mog¹ dostarczyæ wgl¹du w to co dzieje siê z procesem ijakie mog¹ byæ dalsze jego losy.Nie zapominajmy te¿ o ps! To poleceniepokazuje iloœæ pamiêci jak¹ proces wykorzystuje — to bardzo przydatnainformacja.Jeœli program istnieje w kilku wersjach, to warto je wypróbowaæ.Bardzo czêstomo¿e to dostarczyæ jakiejœ wskazówki.Uruchomienie aplikacji z b³êdami na ró¿nych komputerach te¿ mo¿e byæ pomocne.Byæ mo¿e warto uruchomiæ program na komputerze z procesorem Alpha w systemie 64bitowym lub na komputerze SPARC, czy te¿ na komputerze z procesorem PA-RISC,gdzie bardziej znacz¹ce bajty s¹ podane najpierw (ang.big-endian).Jeœlipodejrzewa siê problem z libc to warto spróbowaæ uruchomienia aplikacji nakomercyjnych systemach UNIX, lub opartych na BSD, a nastêpnie porównaæ wyniki.Wreszcie, jeœli b³¹d ju¿ zostanie odnaleziony, dobrze jest dodaæ wykrywaj¹cy gotest do kompletu regresji (ang.regression suit) dla aplikacji.Chodzi o to,aby ten b³¹d nie pojawi³ siê ponownie! Z b³êdami OS (Open Source) trzebapodobnie postêpowaæ.Odnalezienie b³êdu, który dostawca ponownie wprowadzi³(nawet jeœli dostawc¹ jest Open Source) jest bardzo bolesne.Jeœli program zachowuje siê dziwnie i brak jakiegokolwiek pomys³u dlaczego takjest, warto spróbowaæ ró¿nych poziomów optymalizacji lub innych kompilatorów.B³êdy w kompilatorach s¹ rzadkie, niemniej jednak siê zdarzaj¹ — nie jest tojednak pierwsza rzecz jakiej siê mo¿na spodziewaæ
[ Pobierz całość w formacie PDF ]