SO2 1 2 (2011)


SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
PODSTAWY
PROGRAMOWANIA
W SYSTEMIE OPERACYJNYM
UNIX / LINUX
1 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Plan wykładu
" Edytowanie vi / vim
" Kompilowanie za pomocą GCC
" Wykorzystanie GNU Make
" Debugowanie za pomocą GDB
" Interakcja programu ze środowiskiem wykonania
" Tworzenie i używanie bibliotek
2 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Edytowanie vi / vim
" Edytowanie vi / vim
" Kompilowanie za pomocą GCC
" Wykorzystanie GNU Make
" Debugowanie za pomocą GDB
" Interakcja programu ze środowiskiem wykonania
" Tworzenie i używanie bibliotek
3 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
vi - uruchomienie
" vi tworzony jest nowy plik tymczasowy, bez nazwy
nazwa;
" vi plik1 plik2 & do edycji otwierane są pliki z listy argumentów
wywołania edytora vi (przełączanie :e);
" vi  R plik1 pliki plik1 otwierany  tylko do odczytu ; edycja tylko
na buforze, zapis pliku trzeba wymuszać( np. :w!);
" vi  r wyświetlana jest lista odnalezionych plików
wymiany;
" vi  r plik pozwala na odzyskanie pliku wymiany plik (taki
sam efekt :recovery)
T.Przechlewski, Ściąga do vi
4 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
vi  podstawowe operacje na plikach
" ZZ lub :x wyjście z zapisaniem do bieżącego pliku
" :w zapisanie zmian do bieżącego pliku
" :q wyjście, jeśli plik nie był modyfikowany
" :q! wyjście bez zapisywania zmian
" :w plik zapisanie zawartości bufora do pliku
" :x,yw plik zapisanie od wiersza x do y do pliku
" :e plik rozpoczęcie edycji pliku
" :e! pominięcie dokonanych modyfikacji i udostępnienie ponownie
bieżącego pliku do edycji
" :r plik wstawienie zawartości pliku za bieżącym wierszem
" :n edycja następnego pliku z listy argumentów
" :N edycja poprzedniego pliku z listy argumentów
" :f plik nadanie bieżącemu plikowi nazwę plik
" :ls wyświetlenie listy aktualnie edytowanych plików
5 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
vi  przejście do trybu wprowadzania tekstu
" i wstawianie tekstu przed kursorem
" I przesuwa kursor do początku wiersza bieżącego i przechodzi do trybu
wpisywania
" o tworzy wiersz poniżej bieżącego, zaczyna tryb wpisywania
" O tworzy wiersz powyżej bieżącego, zaczyna tryb wpisywania
" a wstawianie tekstu za bieżąca pozycja kursora
" A przesuwa kursor na koniec wiersza bieżącego, zaczyna trybu
wpisywania
" rc wstawienie znaku c w pozycji kursora
" R przejście do trybu nadpisywania tekstu
" przejście do trybu wprowadzania poleceń
i, a
tryb
tryb
edycji
poleceń

6 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
vi  przesuwanie kursora
" ^ początek wiersza z lewej
" $ koniec wiersza z prawej
" + lub początek następnego wiersza
" - początek poprzedniego wiersza
" G początek ostatniego wiersza w pliku
" w początek najbliższego słowa z prawej
" b początek najbliższego słowa z lewej
" e koniec najbliższego słowa z prawej
" { najbliższy początek akapitu z lewej
" } najbliższy koniec akapitu z prawej
" /napis wystąpienie napisu z prawej
" ?napis wystąpienie napisu z lewej
Polecenia z powyższego zestawu mogą być poprzedzone liczbą określającą
zwielokrotnienie, np. 3w oznacza początek trzeciego słowa z prawej strony kursora
a 1G początek pierwszego wiersza.
7 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
vi  usuwanie i modyfikowanie tekstu
Do usuwania fragmentów tekstu służy polecenie dzakres, gdzie zakres określa,
co zostanie usunięte. Zakres określamy dodając do polecenia d polecenie
przesunięcia kursora, m.in.:
" nx usuwa n znaków na prawo od kursora
" nX usuwa n znaków na lewo od kursora
" D lub d$ usuwa od kursora do końca wiersza
" dd usuwa bieżący wiersz
" ndd lub dnd usuwa n wierszy począwszy od bieżącego
" d0 usuwa od początku wiersza do kursora
" dw usuwa od kursora do początku następnego wyrazu
" dG usuwa od bieżącego wiersza do końca pliku
" d/napis usuwa od kursora do podanego napisu (napis jest
wyrażeniem regularnym)
" cctekst zamienia bieżący wiersz na tekst
" Ctekst zamienia od kursora do końca wiersza na tekst
8 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
vi  przesuwanie tekstu z / do bufora
Usuwany fragment tekstu jest kopiowany do specjalnego bufora. Zawartość tego
bufora może zostać wstawiona w innym miejscu za pomocą polecenia p lub P.
Polecenie y, o składni podobnej do poleceń d czy c, kopiuje fragment tekstu
określony przez zakres do bufora nie nazwanego.
" d, dd lub D usuwa tekst do bufora
" yy lub Y kopiuje bieżący wiersz do bufora
" nyy lub nY kopiuje n wierszy do bufora, począwszy od bieżącego
" ynw kopiuje n kolejnych słów do bufora
" y/tekst kopiuje od kursora do tekstu do bufora
" p wstawia zawartość bufora za wiersz bieżący
" P jak wyżej, ale przed wiersz bieżący
d, y
tekst bufor
p
9 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
vi  operacje wyszukiwania i zamiany
" /napis szuka (do przodu) ciągu znaków napis od kursora do
pierwszego znalezionego lub do końca pliku, a następnie
od początku pliku do wiersza bieżącego
" ?napis szuka jak wyżej, ale do tyłu
" n powtórzenie ostatniego wyszukiwania w tym samym
kierunku
" N powtórzenie ostatniego wyszukiwania w kierunku
przeciwnym
Zamiana jest realizowana za pomocą polecenia :s. W najprostszej postaci polecenie
to ma postać:
:s/tekst/tekst-do-wymiany
Instrukcja taka działa tylko w obrębie bieżącego wiersza i zamienia pierwsze
wystąpienie tekstu na tekst-do-wymiany.
10 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
vi  konfigurowanie edytora
" :set ai automatyczne wcinanie wiersza na głębokość wcięcia
wiersza poprzedniego (noai  wyłączenie)
" :set nu numerowanie wierszy (nonu  wyłączenie)
" :set ts=n rozmiar wcięcia po naciśnięciu
" :syntax on podświetlanie składni
Ustawienia można na stałe zapisać w pliku .exrc w katalogu domowym, np.:
.exrc
set ai
set nu
synatx on
11 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Kompilowanie za pomocą GCC
" Edytowanie vi / vim
" Kompilowanie za pomocą GCC
" Wykorzystanie GNU Make
" Debugowanie za pomocą GDB
" Interakcja programu ze środowiskiem wykonania
" Tworzenie i używanie bibliotek
12 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
GCC
" GCC (ang. GNU Compiler Collection) jest zestawem kompilatorów
kompilatory m.in. gcc, g++, g77 (fortran), itd.
" Składnia (dla C i C++)
 gcc [opcje | pliki]  kompilator C
 g++ [opcje | pliki]  kompilator C++
" Etapy działania GCC
 preprocesorowanie (ang. preprocessing)
 kompilacja (ang. compilation)
 asemblacja (ang. assembling)
 konsolidacja (ang. linking)
K.Wall, Using the GNU Compiler Collection, SAMS
13 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
GCC  rozpoznawane rozszerzenia plików
.c zródła C
.C zródła C++
.cc zródła C++
.cxx zródła C++
.c++ zródła C++
.i preprocessed C
.ii preprocessed C++
.s zródła asemblera
.S zródła asemblera
.h pliki nagłówkowe
.o pliki typu obiekt
.a biblioteki
.so biblioteki
14 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
GCC  kompilacja jednego zródła
$ ls  l
-rw-r--r-- 1 burek users 214 2007-02-22 20:04 prostokat.c
$ gcc prostokat.c
$ ls -l
-rwxr-xr-x 1 burek users 11337 2007-02-22 20:05 a.out
-rw-r--r-- 1 burek users 214 2007-02-22 20:04 prostokat.c
$ ./a.out
obwod = 60, pole = 200
$ gcc prostokat.c -o prostokat
$ ls -l
-rwxr-xr-x 1 burek users 11337 2007-02-22 20:05 a.out
-rwxr-xr-x 1 burek users 11337 2007-02-22 20:11 prostokat
-rw-r--r-- 1 burek users 214 2007-02-22 20:04 prostokat.c
$ ./prostokat
obwod = 60, pole = 200
15 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
GCC  główne opcje
-E Tylko preprocesing, na wyjściu dostajemy pliki zródłowe przerobione
przez preprocesor.
-S Zatrzymuj po poziomie kompilacji, nie assembluj, na wyjściu mamy plik
zródłowym z kodem assemblera.
-c Zatrzymuj po poziomie kompilacji lub asemblacji, bez linkowania. Na
wyjściu dostajemy pliki typu obiekt dla każdego pliku zródłowego.
-o nazwa Wskazanie nazwy pliku wynikowego dla danej operacji (przy kompilacji
standardowo dostajemy a.out).
16 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
GCC  kompilacja wielu zródeł
W prostokat.c jest f-cja main(), w lib.c funkcje wywoływane z main.
$ gcc prostokat.c lib.c -o prostokat ; ls -l
-rw-r--r-- 1 burek users 214 2007-02-22 20:07 lib.c
-rwxr-xr-x 1 burek users 11337 2007-02-22 20:08 prostokat
-rw-r--r-- 1 burek users 214 2007-02-22 20:04 prostokat.c
$ gcc  c prostokat.c lib.c ; ls -l
-rw-r--r-- 1 burek users 214 2007-02-22 20:07 lib.c
-rw-r--r-- 1 burek users 214 2007-02-22 20:10 lib.o
-rw-r--r-- 1 burek users 214 2007-02-22 20:04 prostokat.c
-rw-r--r-- 1 burek users 214 2007-02-22 20:10 prostokat.o
$ gcc prostokat.o lib.o -o prostokat ; ls -l
-rw-r--r-- 1 burek users 214 2007-02-22 20:07 lib.c
-rw-r--r-- 1 burek users 214 2007-02-22 20:10 lib.o
-rwxr-xr-x 1 burek users 11337 2007-02-22 20:11 prostokat
-rw-r--r-- 1 burek users 214 2007-02-22 20:04 prostokat.c
-rw-r--r-- 1 burek users 214 2007-02-22 20:10 prostokat.o
17 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
GCC  inne opcje (1)
Opcje preprocesora:
-D macro Ustaw macro na 1.
-D macro=defn Zdefinjuj makro macro jako defn.
-U macro Skasuj definicje makra macro.
Opcje debugera:
-g Dodatkowe informacje dla debugera. Kompilacja z tą opcją
pozwala na pózniejsze debugowanie programu.
-ggdb Dodatkowe informacje dla DBG (możliwość wykorzystania
rozszerzeń GDB)
Opcje preprocesora:
-I dir Dodaje katalog dir do listy katalogów przeszukiwanych ze
względu na pliki nagłówkowe (include file).
-L dir Dodaje katalog dir do listy katalogów przeszukiwanych przy
użyciu przełącznika -l (patrz opcje linkera)
18 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
GCC  inne opcje (2)
Opcje linkera:
-llibrary Użyj biblioteki library kiedy linkujesz. Uwaga! Gcc
automatycznie dodaje przedrostel lib i końcówkę .a, np.
-lFOX w celu załadowania libFOX.a. Patrz też -L.
-nostdlib Nie używaj standardowych bibliotek systemowych i
startowych plików kiedy linkujesz. Używaj tylko wskazane.
Opcje optymalizacji:
-O Optymalizacja.
-Olevel Poziom optymalizacji: 0,1,2,3, jeśli 0, to brak optymalizacji.
Opcje ostrzeżeń:
-Wall Wypisuje ostrzeżenia dla wszystkich sytuacji, które
pretendują do konstrukcji, których używania się nie poleca i
których użycie jest proste do uniknięcia, nawet w połączeniu z
makrami.
19 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
GCC  przykłady użycia
$ gcc  c  O2 prostokat.c
$ gcc  c -I ../include prostakat.c
$ gcc prostokat.c  L ../libs  ltest
$ gcc  c  D DEBUG prostokat.c
$ gcc  g prostokat.c  o prostokat
20 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
GCC  interpretacja komunikatów o błędach
$ gcc prostokat.c
prostokat.c: In function `main':
prostokat.c:10: error: `obwod' undeclared (first use in this function)
prostokat.c:10: error: (Each undeclared identifier is reported only once
prostokat.c:10: error: for each function it appears in.)
prostokat.c:11: error: `pole' undeclared (first use in this function)
prostokat.c:16:2: warning: no newline at end of file
prostokat.c
#include
int main()
{
int x, y;
x = 10;
y = 20;
linia 10 obwod = 2*x + 2*y;
pole = x*y;
linia 11
printf(  obwod = %d, pole = %d \n , obwod, pole);
return( 0);
linia 16
}
21 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Wykorzystanie GNU Make
" Edytowanie vi / vim
" Kompilowanie za pomocą GCC
" Wykorzystanie GNU Make
" Debugowanie za pomocą GDB
" Interakcja programu ze środowiskiem wykonania
" Tworzenie i używanie bibliotek
22 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Budowa prostego pliku Makefile
Makefile
outprogname : binarytree.o mainprog.o
gcc -o outprogname binarytree.o mainprog.o
cel : zależności
reguła
binarytree.o : binarytree.c
gcc -c binarytree.c
mainprog.o : mainprog.c
gcc -c mainprog.c
Wykonanie make dla nowych $ make
gcc -c mainprog.c
plików zródłowych (polecenie
gcc -c binarytree.c
make szuka w aktualnym
gcc -o outprogname binarytree.o mainprog.o
katalogu pliku Makefile)
$ vi main.c
$ make
Ponowne wykonanie make po
gcc -c mainprog.c
modyfikacji mainprog.c
gcc -o outprogname binarytree.o mainprog.o
J.Kroon, CS Students Linux User's Guide: Writing a Makefile
23 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Kiedy make wykona regułę ?
1) Jeżeli plik celu nie istnieje
2) Jeżeli plik celu jest starszy niż któryś z plików określonych
w zależnościach dla tego celu
Makefile
W zależnościach możemy outprogname : binarytree.o mainprog.o
podać pliki, które nie są jawnie
gcc -o outprogname binarytree.o mainprog.o
wykorzystane w regule
binarytree.o : binarytree.c binarytree.h
tworzenia, ale których zmiany
gcc -c binarytree.c
powinny pociągnąć za sobą
ponowne tworzenie celu.
mainprog.o : mainprog.c binarytree.h
gcc -c mainprog.c
24 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Użycie zmiennych w pliku Makefile
Makefile
cc=gcc
cflags=-O3 -g
ldflags=-g
outprogname : binarytree.o mainprog.o
${cc} ${ldflags} -o outprogname binarytree.o mainprog.o
binarytree.o : binarytree.c
${cc} ${cflags} -c binarytree.c
mainprog.o : mainprog.c
${cc} ${cflags} -c mainprog.c
1. 2.
$ make $ make cflags=-O2
gcc -O3 -g -c mainprog.c gcc -O2 -c mainprog.c
gcc -O3 -g -c binarytree.c gcc -O2 -c binarytree.c
gcc -g -o outprogname binarytree.o mainprog.o gcc -g -o outprogname binarytree.o mainprog.o
25 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Makefile - zmienne wbudowane
Makefile
cc=gcc
cflags=-O3 -g
ldflags=-g
$@ - nazwa celu ($% dla archiwów)
$< - pierwszy wymagany
outprogname : binarytree.o mainprog.o
$^ - wszystkie wymagane, bez powtórzeń ${cc} ${ldflags} -o $@ $^
$+ - wszystkie wymagane, z powtórzeniami
binarytree.o : binarytree.c
$? - wszystkie wymagane nowsze niż cel
${cc} ${cflags} -c $<
mainprog.o : mainprog.c
${cc} ${cflags} -c $<
$ make
gcc -O3 -g -c mainprog.c
gcc -O3 -g -c binarytree.c
gcc -g -o outprogname binarytree.o mainprog.o
26 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Makefile - użycie dopasowywania wzorców
Makefile
cc=gcc
cflags=-O3 -g
ldflags=-g
outprogname : binarytree.o mainprog.o
${cc} ${ldflags} -o $@ $^
Tworzenie wszystkich obiektów wymienionych we
wcześniejszych zależnościach
%.o : %.c
${cc} ${cflags} -c $<
$ make
gcc -O3 -g -c mainprog.c
gcc -O3 -g -c binarytree.c
gcc -g -o outprogname binarytree.o mainprog.o
27 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Makefile - funkcje zaawansowane
Funkcje tekstowe:
$(subst FROM,TO,TEXT) zamienia tekst FROM na tekst TO w tekście TEXT
$(patsubst PATTERN,REPLACEMENT,TEXT) zamienianie ze wzorcem
$(strip STRING) usuwa białe znaki z początku i końca
$(filter PATTERN...,TEXT) zwraca te słowa w tekście które pasują do jednego ze wzorców
$(filter-out PATTERN...,TEXT) odwrotnie niż poprzednia
$(sort LIST) sortuje listę słów, usuwa duplikaty
$(word N,TEXT) zwraca n-te słowo
$(words TEXT) zwraca liczbę słów w tekście
Funkcje od plików:
$(dir NAZWY) wydobywa nazwy katalogów
$(notdir NAZWY) wydobywa ostatni człon
$(suffix NAZWY) wydobywa rozszerzenia
$(basename NAZWY) wydobywa wszystko oprócz rozszerzeń
wzór rozwinięcie
$(patsubst %.c,%.o,x.c.c bar.c) x.c.o bar.o
sources = foo.c bar.c baz.s ugh.h
foo: $(sources) foo: foo.c bar.c baz.s ugh.h
cc $(filter %.c %.s,$(sources)) -o foo cc foo.c bar.c baz.s -o foo
28 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Przykład pliku Makefile
Makefile
CFLAGS+=-Wall -g
CXXFLAGS+=-Wall -g
MAIN_TARGETS_UNSORTED=$(patsubst %.cpp, %, $(wildcard *.cpp)) $(patsubst %.c, %,\
$(wildcard *.c))
MAIN_TARGETS=$(sort $(MAIN_TARGETS_UNSORTED))
all: $(MAIN_TARGETS)
%: %.c %.h
$(CC) $(CFLAGS) $(CPPFLAGS) $< -o $@
%: %.c
$(CC) $(CFLAGS) $(CPPFLAGS) $< -o $@
%: %.cpp %.h
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $< -o $@
%: %.cpp
$(CXX) $(CXXFLAGS) $(CPPFLAGS) $< -o $@
clean:
rm -f $(MAIN_TARGETS)
29 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Debugowanie za pomocą GDB
" Edytowanie vi / vim
" Kompilowanie za pomocą GCC
" Wykorzystanie GNU Make
" Debugowanie za pomocą GDB
" Interakcja programu ze środowiskiem wykonania
" Tworzenie i używanie bibliotek
30 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
gdb - podstawy
Kompilacja programu - debugowany plik wykonywalny musi mieć dołączoną na
etapie kompilacji i linkowania tablicę symboli (opcja -g)
$ gcc -g prostokat.c ./prostokat
$ gcc -g -c mainprog.c
$ gcc -g -c binarytree.c
$ gcc -g -o outprogname binarytree.o mainprog.o ./outprogname
Uruchomienie gdb
bez argumentów $ gdb
z nazwą programu $ gdb outproganem
z nazwą programu i pidem procesu $ gdb outproganem 12345
z nazwą programu i zrzutem pamięci $ gdb qsort2 core.2957
Core was generated by `qsort2'.
Program terminated with signal 7, Emulator trap.
#0 0x2734 in qsort2 (l=93643, u=93864, strat=1)
at qsort2.c:118
118 do i++; while (i <= u && x[i] < t);
(gdb) quit
$
M.Loukides, A.Oram, Getting to Know gdb
31 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
gdb  pliki i uruchomienie programu
file [file] użyj plik file jako plik wykonywalny i tablicę symboli
core [file] użyj plik file jako zrzut pamięci
load [file] dołącz dynamicznie plik file
info share wyświetl nazwy wszystkich aktualnie załadowanych
bibliotek dzielonych
run arglist uruchom program z listą argumentów arglist
run uruchom program z aktualną listą argumentów
set args arglist ustal listę argumentów arglist dla kolejnego
uruchomienia
set args wyczyść listę argumentów dla kolejnego uruchomienia
show args wyświetl listę argumentów dla kolejnego uruchomienia
show env wyświetl wszystkie zmienne systemowe
32 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
gdb - pułapki (breakpoints)
Użycie b jest równoważne użyciu break.
b [file:]line ustaw breakpoint w linii line [w pliku file]
b [file:]func ustaw breakpoint na funkcji func [w pliku file]
b ... if expr przerwij warunkowo, jeżeli expr prawdziwe
tbreak ... breakpoint tymczasowy (jednorazowy)
rbreak regex przerywaj na wszystkich funkcjach dopasowanych do
wyrażenia regex
catch event przerwij po zdarzeniu event , (zdarzeniami mogą być
catch, throw, exec, fork, vfork, load,
unload)
info break wyświetl zdefiniowane breakpointy
clear usuń breakpoint z kolejnej instrukcji
clear [file:]func usuń breakpoint z funkcji func
clear [file:]line usuń breakpoint z linii line
delete [n] usuń wszystkie breakpointy [lub o numerze n]
33 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
gdb - wykonanie programu
continue, c [count] kontynuuj wykonanie; jeżeli określono count
to ignoruj count kolejnych breakpointów
step, s [count] wykonaj pojedynczy krok (wchodzi do wnętrz
funkcji); powtórz count razy
next, n [count] wykonaj pojedynczy krok; powtórz count
razy
until location wykonaj aż do lokalizacji location (np. nr
linii)
finish wykonaj aż do zakończenia aktualnej f-cji i
wyświetl zwróconą wartość
jump line wznów wykonanie od linii line
set var=expr zapisz do zmiennej o nazwie var wartość
expr
backtrace wyświetl wszystkie ramki ze stosu (m.in.
informacja o wywołanych funkcjach)
34 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
gdb - wyświetlanie danych
print, p [/f][expr] wyświetl wartość wyrażenia expr (albo
wyrażenia ostatnio wyświetlanego) zgodnie z
formatem f
display [/f][expr] wyświetlaj wartość wyrażenia expr zawsze
gdy program się zatrzyma (zgodnie z
formatem f )
display wyświetl listę wszystkich obserwowanych
zmiennych
undisplay n usuń z listy obserwowanych zmiennych
n -te wyrażenie
35 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
gdb - sygnały i przeglądanie kodu
handle signal act ustal reakcję act gdb na sygnał signal; możliwe
reakcje: print (wyświetl informację o pojawieniu
się sygnału), noprint (nie wyświetlaj), stop
(zatrzymaj wykonanie), nostop (nie zatrzymuj),
pass (pozwól debugowanemu programowi na
odebranie sygnału), nopass (nie przekazuj sygnału
do programu)
info signals wyświetl tablicę obsługiwanych sygnałów GDB
list wyświetl 10 kolejnych linii kodu
list - wyświetl 10 poprzednich linii kodu
list [file:]num wyświetl 10 linii kodu wokół linii num w [pliku file]
list [file:]func wyświetl 10 linii kodu wokół początku funkcji func w
[pliku file]
list f,l wyświetl kod od linii f do linii l
info sources wyświetl listę wszystkich plików zródłowych
36 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Interakcja programu ze środowiskiem wykonania
" Edytowanie vi / vim
" Kompilowanie za pomocą GCC
" Wykorzystanie GNU Make
" Debugowanie za pomocą GDB
" Interakcja programu ze środowiskiem wykonania
" Tworzenie i używanie bibliotek
M.Mitchel, J.Oldham, A.Samuel, LINUX: Programowanie dla zaawansowanych
37 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Argumenty wywołania i zmienne środowiskowe
#include
extern char** environ;
int main( int argc, char **argv)
{
char **var;
for( var = environ; *var != NULL; ++var)
printf( "%s\n", *var);
for( int i=0; iprintf( "%s\n", argv[ i]);
return 0;
}
38 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
stdin, stdout i stderr
" standardowy strumień wejścia: stdin 0 np. scanf
" standardowy strumień wyjścia: stdout 1 np. printf
" standardowy strumień błędów: stderr 2
" stdout jest buforowany, fflush( stdout) powoduje opróżnienie
bufora
" f-cje read, write czy fprint, które oczekują jako argumentu
uchwytu do pliku, mogą obsłużyć standardowe strumienie, np.:
write( stderr,  abc , 4)
" przekierowanie wyjść do plików lub potoków przy wywołaniu programu
(przekierowanie stderr do stdout musi być po przekierowaniu stdout do
pliku, ale przed przekierowaniem do potoku):
$ program > output_file.txt 2>&1
$ program 2>&1 | filter
39 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Tworzenie i używanie bibliotek
" Edytowanie vi / vim
" Kompilowanie za pomocą GCC
" Wykorzystanie GNU Make
" Debugowanie za pomocą GDB
" Interakcja programu ze środowiskiem wykonania
" Tworzenie i używanie bibliotek
40 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Tworzenie biblioteki statycznej
Biblioteka statyczna jest plikiem archiwum (rozszerzenie *.a) zawierającym zbiór
obiektów (rozszerzenie *.o), które powstały w wyniku kompilacji. Do tworzenia i
zarządzania archiwami służy program ar.
$ ar cr libname.a obj1.o obj2.o obj3.o ...
create replace
libtest.h
int add( int a, int b);
void shrink( char *str);
$ gcc -c libtest.c
libtest.c
$ ar cr libtest.a libtest.o
#include "libtest.h"
int add( int a, int b) { return a+b;}
void shrink( char *str) { str[1]=0;};
41 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Użycie biblioteki statycznej
Aby dołączyć bibliotekę statyczną:
" dołączamy w kodzie zródłowym programu odniesienie do pliku nagłówkowego biblioteki
" podczas konsolidacji programu używamy przełącznika  l podając nazwę biblioteki (nazwa bez lib
i .a)
" opcjonalnie wykorzystujemy przełącznik  L aby wskazać katalogi, które mogą zawierać bibliotekę
Uwaga: kolejność wywołania przełączników ma znaczenie! Biblioteki należy dołączać na
końcu linii poleceń, ponieważ linker przeszukuje je pod kątem wszystkich symboli, do których
były odniesienia w przetworzonych wcześniej plikach i które nie zostały jeszcze zdefiniowane.
Fragmenty kodu z bibliotek są kopiowane do pliku wynikowego.
static.c
#include "libtest.h"
$ ls
int main()
libtest.a static.c
{
$ gcc static.c  o static  L. -ltest
int c = add( 10, 20);
return 0;
}
42 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Tworzenie biblioteki współdzielonej
Biblioteka współdzielona jest zbiorem obiektów o rozszerzeniu *.so.#1.#2.#3 (numery #1, #2 i
opcjonalne #3 oznaczają numery wersji  począwszy od najbardziej istotnego). Jest on
linkowana przy pomocy gcc z opcjami  shared i  fPIC (opcja  fPIC również przy
kompilacji obiektów). W kodzie biblioteki nie może być f-cji main, mogą być za to _init() i
_fini()(po ustawieniu opcji -nostartfiles).
$ gcc  shared -fPIC  o libname.so.0.0.0 obj1.o obj2.o obj3.o ...
libtest.h
int add( int a, int b);
void shrink( char *str);
libtest.c
$ gcc -c  fPIC libtest.c
$ gcc  shared  fPIC libtest.o \
#include "libtest.h"
-o libtest.so.0.1 -nostartfiles
#include
int add( int a, int b) { return a+b;}
void shrink( char *str) { str[1]=0;}
_init() { printf  connect ...\n";}
_fini() { printf "... free\n";}
43 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Użycie biblioteki współdzielonej - łączenie
Aby dołączyć bibliotekę współdzieloną podczas konsolidacji wykonujemy dokładnie te
same czynności co przy dołączaniu biblioteki statycznej. Opcjonalnie możemy w kod
wynikowy wkompilować informację o ścieżce, gdzie program będzie miał szukać bibliotekę
podczas uruchamiania (opcja  Wl,-rpath,path). Kod programu nie zawiera kodu
bibliotecznego, a jedynie odnośniki do niego. Bibliotek jest ładowana przy uruchamianiu
programu. Każde podłączenie biblioteki powoduje wywołanie f-cji _init(), odłączenie -
wywołanie f-cji _fini().
sshared.c
#include "libtest.h"
$ ls
libtest.so.0.1 sshared.c
int main()
$ gcc sshared.c  o sshared  L.  ltest \
{
-Wl,-rpath,.
int c = add( 10, 20);
return 0;
}
44 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Użycie biblioteki współdzielonej  ładowanie (1)
Bibliotek współdzielona może zostać załadowana dynamicznie podczas działania programu.
Służą do tego f-cje biblioteki dl:
1) ładowanie biblioteki
void *dlopen(const char *file, int mode);
2) obsługa błędów
char *dlerror(void);
3) ładowanie symboli (m.in. funkcji)
void *dlsym(void *restrict handle, const char *restrict name);
4) zwolnienei biblioteki
int dlclose(void *handle);
Funkcje wymagają dołączenia do programu pliku nagłókowego oraz biblioteki dl.
Każde załadowanie biblioteki powoduje wywołanie f-cji _init(), zwolnienie biblioteki -
wywołanie f-cji _fini().
45 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Użycie biblioteki współdzielonej  ładowanie (2)
dshared.c
#include
int ( *Add)( int, int);
int main()
{
void *handle = dlopen( "./libtest.so.0.1", RTLD_LAZY);
if( !handle)
dlerror();
else
{
Add = dlsym( handle, "add");
int c = Add( 10, 20);
dlclose( handle);
}
return 0;
}
$ gcc dshared.c  o dshared -ldl
46 / 47
SYSTEMY OPERACYJNE II UNIX  PODSTAWY PROGRAMOWANIA
Biblioteki - informacje dodatkowe
" Biblioteki podane przy konsolidacji po opcji  l wyszukiwane są standardowo w
katalogach /lib i /usr/lib. Można to zmieniać za pomocą zmiennej
środowiskowej LD_LIBRARY_PATH
" W systemie mogą istnieć wersje statyczna i współdzielona tej samej biblioteki:
 linker dołącza bibliotekę, na którą pierwszą się natknie przy przeszukiwaniu katalogów
bibliotek;
 jeżeli w tym samym katalogu jest wersja statyczna i współdzielona, to pierwszeństwo
ma wersja współdzielona;
 użycie opcji  static wymusza użycie wersji statycznej biblioteki;
 współdzielona wersja biblioteki sama rozwiązuje swoje zależności (czyli dołącza
kolejne wymagane biblioteki);
 statyczna wersja biblioteki wymaga jawnego obsłużenia swoich zależności (przy
linkowaniu programu trzeba dołączyć również biblioteki potrzebne dla bibliotek).
" Zależności w programie można sprawdzić za pomocą polecenia ldd
" Biblioteki funkcjonują pod 3 podstawowymi nazwami:
 real name, np. libtest.so.0.1
 soname, np. libtest.so.0 ($ ln  s libtest.so.0.1 libtest.so.0)
 linker name, np. libtest.so ($ ln  s libtest.so.0.1 libtest.so)
47 / 47


Wyszukiwarka

Podobne podstrony:
SO2 2 1 (2011)
SO2 2 2 (2011)
SO2 1 1 (2011)
2011 05 P
BHP styczeń 2011 odpowiedzi wersja x
ZARZĄDZANIE WARTOŚCIĄ PRZEDSIĘBIORSTWA Z DNIA 26 MARZEC 2011 WYKŁAD NR 3
Fakty nieznane , bo niebyłe Nasz Dziennik, 2011 03 16
Kalendarz roku szkolnego na lata 2011 2029
test zawodowy 7 06 2011
2011 experimental problems
Mirota 1 2011
2011 kwiecień
Środowa Audiencja Generalna Radio Maryja, 2011 03 09

więcej podobnych podstron