Slajd 1 - PowerPoint PPT Presentation

About This Presentation
Title:

Slajd 1

Description:

Title: Slajd 1 Author: Jozef Adam Liwo Last modified by: Jozef Adam Liwo Created Date: 11/20/2006 3:37:09 PM Document presentation format: Pokaz na ekranie – PowerPoint PPT presentation

Number of Views:65
Avg rating:3.0/5.0
Slides: 28
Provided by: JozefAd7
Category:
Tags: grace | hopper | murray | slajd

less

Transcript and Presenter's Notes

Title: Slajd 1


1
Odrobaczanie (debugging) programu
Zasada van Tassela Zaden program nie dziala od
razu. Badz szczególnie podejrzliwy, jezeli za
pierwszym razem dostales poprawna
odpowiedz. Pojecie robaka (bug) w
elektronicznej technice obliczeniowej przypisuje
sie admiral U.S. Navy, Grace Murray Hopper,
twórczyni COBOLu, która opowiadala historie o
techniku, który naprawil komputer Harvard II
usuwajac cme z obwodów. Cala historia jest
opisana w Annals of the History of Computing, 3
285-286 (1981). Pózniej uogólniono to pojecie na
zle funkcjonowanie programów. Jeszcze wczesniej
mianem bug okreslano defekty urzadzen
elektrycznych ("Hawkin's New Catechism of
Electricity", T. Audel Co., 1896) albo
przyczyny szumu na liniach telefonicznych lub
telegraficznych. Slowa bug w sensie naglego
rujnujacego zdarzenia uzywano juz w czasach
Shakespearea. Samo slowo w tym znaczeniu
prawdopodobnie pochodzi z walijskiego
(zanglicyzowanego) bugbear, oznaczajacego
rózne mityczne potwory.
2
Strona z dziennika komputera Harvard II z opisem
usuniecia cmy z obwodów wraz z przyklejonym
owadem.
Admiral Grace Murray Hopper (1896-1992)
3
Jeden z najslawniejszych bledów w FORTRANie
(historia opisana przez Freda Webba na
alt.folklore.computers w roku 1990
I worked at Nasa during the summer of 1963. The
group I was working in was doing preliminary work
on the Mission Control Center computer systems
and programs. My office mate had the job of
testing out an orbit computation program which
had been used during the Mercury flights. Running
some test data with known answers through it, he
was getting answers that were close, but not
accurate enough. So, he started looking for
numerical problems in the algorithm, checking to
make sure his tests data was really correct, etc.
After a couple of weeks with no results, he came
across a DO statement, in the form DO 10 I1.10
This statement was interpreted by the compiler
(correctly) as DO10I 1.10 The programmer
had clearly intended DO 10 I 1, 10
4
Najczestsze bledy podczas programowania w
FORTRANie i sposoby zapobiegania im
Literówki w nazwach i nie tylko (np. JI zamiast IJ, 1 zamiast I lub O zamiast 0 jako indeks tablicy albo w wyrazeniach Rezygnacja z reguly pierwszej litery (zawsze dajemy IMPLICIT NONE). Uzywanie malych a nie duzych liter (trudno pomylic z cyframi)
Pomylkowe wstawienie zmiennych lub stalych calkowitych aby uzyskac wyrazenie rzeczywiste (np. X1/6) Czasami pomaga wymóg deklarowania zmiennych
Niewspólmiernosc bloków COMMON w róznych segmentach Bloki COMMON zapisac w plikach I uzywac instrukcji INCLUDE
Niezgodnosc rozmiarów tablic w róznych segmentach Deklarowac dyrektywa PARAMETER stale uzywane w wymiarowaniu tablic i zapisac deklaracje w plikach wlaczanych do zródla przez INCLUDE
Wyjscie poza 72-ga kolumne Uzywac edytorów tekstów z licznikiem kolumn
Uzycie tablicy w kontekscie zmiennej prostej lub odwrotnie
Niezgodnosc listy parametrów formalnych i aktualnych
5
Sposoby odrobaczania programu
  • Analiza kodu zródlowego
  • Analiza wyników dzialania programu
  • Diagnostyka uzytkownika (drukowanie wyników
    posrednich)
  • Uzycie opcji kompilatora generujacych informacje
    diagnostyczna oraz sprawdzajacych przekroczenie
    granic tablic.
  • Uzycie odpowiednego programu narzedziowego,
    debuggera.

6
Szesc zasad odrobaczania.
  1. Doprowadz do tego, zeby blad byl powtarzalny.
  2. Zawez problem do najprostszych przebiegów z
    najmniejszym zestawem danych, najlepiej takich
    gdzie wszystkie operacje mozesz przeprowadzic na
    piechote.
  3. Zlokalizuj najmniejsza jednostke programu, gdzie
    blad wystepuje.
  4. Przeprowadz odpowiednio zaplanowane eksperymenty
    (np., jezeli program ma obliczyc kat miedzy
    trzema atomami rozsadnie jest wybrac najpierw
    wspólrzedne które dadza kat prosty, potem pelny,
    potem dowolny.
  5. Uzywaj doswiadczenia wlasnego i innych.
  6. Nigdy nie dopuszczaj mysli, ze problemu nie
    rozwiazesz albo ze do jego rozwiazania jest
    potrzebna wiedza magiczna.

Wiecej w artykule Terence Parr Learn the
Essentials of Debugging
7
Debuggery do kodów FORTRANowskich
gdb (Linux, darmowy) dbx (AIX i inne systemy
przychodzi z kompilatorem) xdb (AIX
okienkowy) totalview (AIX, UNICOS okienkowy)
8
Praca z debuggerem gdb
Kompilacja z opcja g (dodaje informacje
diagnostyczna do kodu wynikowego) Przyklad f77
g program.f o program Warto dodac sprawdzanie
rozmiarów tablic (opcja fbounds-check), np f77
g fbounds-check program.f o program Tak
skompilowany program mozna uruchomic z poziomu
gdb gdb program
9
Podstawowe komendy debuggera
break plik.fnr_linii ustawienie punktu
zatrzymania w linii nr_linii pliku zródlowego
plik.f clear plik.fnr_linii usuniecie danego
punktu zatrzymania run wykonanie programu do
konca lub pierwszego zatrzymania cont wznowieni
e wykonywania programu po napotkaniu punktu
zatrzymania next liczba_linii przejscie do
nastepnej linii lub wykonanie nastepnych
liczba_linii kodu danego podprogramu bez
wliczania linii wywolywanych popdrogramów lub
funkcji. step liczba_linii przejscie do
nastepnej instrukcji lub wykonanie nastepnych
liczba_linii instrukcji programu, wlaczajac
linie podprogramów lub funkcji
wywolywanych print zmienna drukowanie wartosci
danej zmiennej. quit wyjscie z debuggera.
10
Troche bardziej zaawansowane ale uzyteczne
komendy cd katalog zmiana katalogu roboczego na
katalog pwd pokazuje katalog roboczy file
prog ladowanie programu prog do debuggera set
args arg wprowadzanie argumentów arg do linii
polecenia programu list nr1,nr2 listowanie 10
linii kodu scentrowanych na danej linii
(uwaga kolejne list kontytuuje) albo od linii
nr1 do linii nr2. list - listowanie
nastepnych () albo poprzednich (-) linii kodu
zródlowego. list plik.flinia listowanie kodu
zródlowego z pliku plik.f poczawszy od linii
linia. info kategoria informacja na temat danej
kategorii np. info break podaje informacje o
punktach zatrzymania where pokazuje w którym
miejscu programu sie znajdujemy backtrace where
full pokazuje gdzie sie znajdujemy oraz drukuje
wartosci wszystkich backtrace full zmiennych w
danym segmencie oraz segmentach wywolujacych
11
set zwartosc nadawanie nowej wartosci zmiennej z
wystepujacej w aktualnie analizowanym module
programu set env zmwyr Nadawanie wartosci wyr
zmiennej srodowiskowej zm unset env
zm anulowanie zmiennej srodowiskowej zm show
env pokazuje zmienne srodowiskowe show
path pokazuje sciezki dostepu where
full pokazuje gdzie sie znajdujemy oraz drukuje
wartosci wszystkich zmiennych w danym
segmencie oraz segmentach wywolujacych watch
wyrazenie zatrzymuje program jezeli wartosc
wyrazenia wyrazenie zmienia sie i drukuje nowa
wartosc (wyrazenie moze byc nazwa
zmiennej) awatch wyrazenie zatrzymuje program
jezeli wyrazenie jest pisane lub czytane rwatch
wyrazenie zatrzymuje program, jezeli wyrazenie
jest czytane
Pelen opis gdb http//www.delorie.com/gnu/docs/gd
b/gdb.html
12
Przyklad uzycia debuggera do sledzenia
wykonywania programu titr obliczajacego krzywa
miareczkowania mocnego kwasu mocna zasada
Zródla FORTRANowskie titr.f czyt_dane.f
oblicz_krzywa.f oblicz_ph.f pisz_wyniki.f
DIMENSIONS Dane krzywa_dane Wyniki krzywa_wyniki
Plik Makefile
13
Przyklad sesji debuggera
etoh/FORTRAN/DEBUGgt gdb titr (gdb) break
titr.f15 Breakpoint 1 at 0x804887b file titr.f,
line 15. (gdb) run Starting program
/big/staff/adam/FORTRAN/DEBUG/titr Breakpoint 1,
MAIN__ () at titr.f15 15 CALL
OBLICZ_KRZYWA(IOUT,CKW,CZ,VKW) Current language
auto currently fortran (gdb) print ckw 1
0.10000000000000001 (gdb) next 17 CALL
PISZ_WYNIKI(IOUT) (gdb) step pisz_wyniki__
(wyjscie0x804a050) at pisz_wyniki.f7 7
OPEN(WYJSCIE,FILE'krzywa.wyniki',STATUS'UNKNO
WN') (gdb) step 3 11
WRITE(WYJSCIE,'(I3,2x,F5.2,F8.3)')
I,OBJZ(I),PH(I) (gdb) cont Continuing. Program
exited normally. (gdb)
14
Sprawdzanie przekroczenia rozmiarów tablic
Zmieniamy w pliku DIMENSIONS maksymalna liczbe
punktów ze 100 na 10 PARAMETER
(MAXPUNKT10) Kompilujemy bez debuggingu etoh/FO
RTRAN/DEBUGgt make f77 -c titr.f f77 -c
czyt_dane.f f77 -c oblicz_krzywa.f f77 -c
oblicz_ph.f f77 -c pisz_wyniki.f f77 -o titr
titr.o czyt_dane.o oblicz_krzywa.o oblicz_ph.o
pisz_wyniki.o etoh/FORTRAN/DEBUGgt
./titr Program pozornie sie wykonal ale plik
krzywa.wyniki zawiera tylko naglówek etoh/FORTR
AN/DEBUGgt more krzywa.wyniki Punkt VZ pH
15
Teraz kompilujemy z fbounds-check
g etoh/FORTRAN/DEBUGgt make -f
Makefile-debug f77 -c -fbounds-check -g
titr.f f77 -c -fbounds-check -g czyt_dane.f f77
-c -fbounds-check -g oblicz_krzywa.f f77 -c
-fbounds-check -g oblicz_ph.f f77 -c
-fbounds-check -g pisz_wyniki.f f77 -o titr
-fbounds-check -g titr.o czyt_dane.o
oblicz_krzywa.o oblicz_ph.o pisz_wyniki.o Po
uruchomieniu od razu widac, gdzie jest
problem etoh/FORTRAN/DEBUGgt ./titr Subscript
out of range on file line 12, procedure
czyt. Attempt to access the 21-th element of
variable vz. Abort
16
SUBROUTINE CZYT_DANE(WEJSCIE,STKW,STZ,OBJKW)
C Czytanie danych wejsciowych IMPLICIT
NONE INCLUDE 'DIMENSIONS' INTEGER
WEJSCIE,I,NPUNKT REAL8 STKW,STZ,OBJKW
REAL8 VZ(MAXPUNKT),PH(MAXPUNKT) COMMON
/KRZYWA/ VZ,PH,NPUNKT OPEN(WEJSCIE,FILE'kr
zywa.dane',STATUS'OLD') READ(WEJSCIE,)
NPUNKT,STKW,STZ,OBJKW READ(WEJSCIE,)
(VZ(I),I1,NPUNKT) CLOSE(WEJSCIE)
RETURN END
Zatrzymanie
17
Podobne informacje dostajemy uruchamiajac program
z poziomu debuggera etoh/FORTRAN/DEBUGgt gdb
titr (gdb) run Starting program
/big/staff/adam/FORTRAN/DEBUG/titr Subscript out
of range on file line 12, procedure czyt. Attempt
to access the 21-th element of variable
vz. Program received signal SIGABRT,
Aborted. 0x4009283b in raise () from
/lib/tls/libc.so.6 Mozemy wtedy zapytac
dokladnie gdzie blad nastapil (gdb) where 0
0x4009283b in raise () from /lib/tls/libc.so.6 1
0x40093fa2 in abort () from /lib/tls/libc.so.6 2
0x4002846f in sig_die () from
/usr/lib/libg2c.so.0 3 0x40027c94 in s_rnge ()
from /usr/lib/libg2c.so.0 4 0x080489ea in
czyt_dane__ (wejscie0x804a04c, stkw0xbffffc10,
stz0xbffffc08, objkw0xbffffc00) at
czyt_dane.f12 5 0x0804887b in MAIN__ () at
titr.f12 6 0x08048dd6 in main ()
18
Mozna tez uzyskac pelna informacje, lacznie z
wartosciami zmiennych (gdb) where full 0
0x4009283b in raise () from /lib/tls/libc.so.6 No
symbol table info available. 1 0x40093fa2 in
abort () from /lib/tls/libc.so.6 No symbol table
info available. 2 0x4002846f in sig_die () from
/usr/lib/libg2c.so.0 No symbol table info
available. 3 0x40027c94 in s_rnge () from
/usr/lib/libg2c.so.0 No symbol table info
available. 4 0x080489ea in czyt_dane__
(wejscie0x804a04c, stkw0xbffffc10,
stz0xbffffc08, objkw0xbffffc00) at
czyt_dane.f12 __g77_impdo_0 10
__g77_cilist_1 err 0, unit 1, end 0,
format 0x0, rec 0
19
i 21 npunkt 31 vz 1, 2,
3, 4, 5, 6, 7, 8, 9, 9.1999999999999993,
9.4000000000000004, 9.5999999999999996,
9.8000000000000007, 9.9000000000000004,
9.9499999999999993, 9.9900000000000002, 10,
10.01, 10.050000000000001, 10.1 ph
0 ltrepeats 20 timesgt 5 0x0804887b in MAIN__
() at titr.f12 n 31 inp 1
iout 2 ckw 0.10000000000000001
cz 0.10000000000000001 vkw 10
vz 1, 2, 3, 4, 5, 6, 7, 8, 9,
9.1999999999999993, 9.4000000000000004,
9.5999999999999996, 9.8000000000000007,
9.9000000000000004, 9.9499999999999993,
9.9900000000000002, 10, 10.01,
10.050000000000001, 10.1 ph 0
ltrepeats 20 timesgt 6 0x08048dd6 in main () No
symbol table info available.
20
Dlaczego blad nie byl sygnalizowany bez opcji
fbounds-check, natomiast program nie wydrukowal
wyników ?
Kompilujemy tylko z opcja g etoh/FORTRAN/DEBU
Ggt make -f Makefile-debug1 f77 -c -g titr.f f77
-c -g czyt_dane.f f77 -c -g oblicz_krzywa.f f77
-c -g oblicz_ph.f f77 -c -g pisz_wyniki.f f77 -o
titr -g titr.o czyt_dane.o oblicz_krzywa.o
oblicz_ph.o pisz_wyniki.o
21
Kompilujemy tylko z opcja g etoh/FORTRAN/DEBU
Ggt make -f Makefile-debug1 f77 -c -g titr.f f77
-c -g czyt_dane.f f77 -c -g oblicz_krzywa.f f77
-c -g oblicz_ph.f f77 -c -g pisz_wyniki.f f77 -o
titr -g titr.o czyt_dane.o oblicz_krzywa.o
oblicz_ph.o pisz_wyniki.o Uruchamiamy z gdb
ustawiajac zatrzymanie w pisz_wyniki.f etoh/FOR
TRAN/DEBUGgt gdb titr (gdb) break
pisz_wyniki.f1 Breakpoint 1 at 0x8048aec file
pisz_wyniki.f, line 1. (gdb) run Starting
program /big/staff/adam/FORTRAN/DEBUG/titr Break
point 1, pisz_wyniki__ (wyjscie0x804864c) at
pisz_wyniki.f1 1 SUBROUTINE
PISZ_WYNIKI(WYJSCIE) Current language auto
currently fortran
22
Drukujemy pelna informacje (gdb) where full 0
pisz_wyniki__ (wyjscie0x804864c) at
pisz_wyniki.f1 i 1069128089
npunkt -2112311744 objz (1, 2, 3, 4,
5, 6, 7, 8, 9, 9.1999999999999993,
9.4000000000000004, 9.5999999999999996,
9.8000000000000007, 9.9000000000000004,
9.9499999999999993, 9.9900000000000002, 10,
10.01, 10.050000000000001, 10.1) ph
(1.0871501757189002, 1.1760912590556813,
1.26884531229258, 1.3679767852945943,
1.4771212547196624, 1.6020599913279623,
1.7533276666586115, 1.9542425094393248,
2.2787536009528289, 2.3802112417116055,
2.5096504795465826, 2.6901960800285134,
2.9956351945975515, 3.2988530764097082,
3.6009728956867422, 4.3008127941181264, 7,
9.6987529113637798, 10.396855627379825,
10.696803942579511)
23
1 0x08048868 in MAIN__ () at titr.f16
n -2112311744 inp 1 iout 2
ckw 0.10000000000000001 cz
0.10000000000000001 vkw 10 vz
(1, 2, 3, 4, 5, 6, 7, 8, 9, 9.1999999999999993,
9.4000000000000004, 9.5999999999999996,
9.8000000000000007, 9.9000000000000004,
9.9499999999999993, 9.9900000000000002, 10,
10.01, 10.050000000000001, 10.1) ph
(1.0871501757189002, 1.1760912590556813,
1.26884531229258, 1.3679767852945943,
1.4771212547196624, 1.6020599913279623,
1.7533276666586115, 1.9542425094393248,
2.2787536009528289, 2.3802112417116055,
2.5096504795465826, 2.6901960800285134,
2.9956351945975515, 3.2988530764097082,
3.6009728956867422, 4.3008127941181264, 7,
9.6987529113637798, 10.396855627379825,
10.696803942579511) 2 0x08048c76 in main () No
symbol table info available.
24
Taka wartosc zmiennej NPUNKT (w pisz_wyniki.f)
lub N (w titr.f) jest wynikiem nadpisania jej
przez pierwszy element tablicy PH wykraczajacy
poza zadeklarowany rozmiar tablicy. Zmienna
NPUNKT lub N sasiadje z tablica PH w obszarze
wspólnym KRZYWA REAL8 VZ(MAXPUNKT),PH(MAXPUNK
T) COMMON /KRZYWA/ VZ,PH,NPUNKT Blad ten
nastapil w podprogramie oblicz_krzywa.f, gdzie
jest wypelniana tablica PH. Jezeli podejrzewamy,
ze problem jest ze zmienna NPUNKT, mozemy
wydrukowac jej wartosc bez zrzucania calego
zestawu zmiennych w danym punkcie
programu. (gdb) print npunkt 1 -2112311744
25
Zmiane wartosci n mozemy tez sledzic przy pomocy
komendy watch (gdb) break titr.f1 Breakpoint 1
at 0x8048814 file titr.f, line 1. (gdb)
run Starting program /big/staff/adam/FORTRAN/DEBU
G/titr Breakpoint 1, MAIN__ () at titr.f1 1
PROGRAM TITR Current language auto
currently fortran
26
(gdb) watch n Hardware watchpoint 2 n (gdb)
cont Continuing. Hardware watchpoint 2 n Old
value 0 New value 31 0x4002ffc7 in l_read ()
from /usr/lib/libg2c.so.0 (gdb)
cont Continuing. Hardware watchpoint 2 n Old
value 31 New value -2112311744 oblicz_krzywa__
(wyjscie0x8049010, stkw0xbffffc10,
stz0xbffffc08, objkw0xbffffc00) at
oblicz_krzywa.f13 13 ENDDO
27
Uzyteczne warianty wywolywania gdb Analiza
zrzutu pamieci (coredump) programu który sie
wywalil Zwykle zrzut jest zapisany w pliku
core. Przykladowo po wywolaniu gdb prog core gdb
zachowa sie tak, jakby program prog byl
uruchomiony z poziomu debuggera i zatrzymal sie
wskutek bledu, zatem mozna prowadzic analize
uzywajac where, print, itp. Kolejnosc argumentów
nie obowiazuje jezeli prog poprzedzimu e a core
c. Debugging juz uruchomionego programu gdb
prog nr_procesu Gdzie prog jest nazwa pliku
wykonywalnego a nr_procesu numerem procesu
odpowiadajacego chodzacemu programowi. Specyfik
owanie katalogów, gdzie znajduja sie pliki
zródlowe gdb d katalog prog
Write a Comment
User Comments (0)
About PowerShow.com