You are on page 1of 34

NARZĘDZIA PROGRAMISTY

Krzysztof Patan

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
k.patan@issi.uz.zgora.pl

Plan wykładu:

1. Kompilator języka C
2. Zarządzanie projektami
3. Edytory
4. Debugowanie
5. Profilowanie
6. Tworzenie plików pomocy
7. Środowiska programistyczne
Narzędzia programisty 1

Kompilator języka C/Objective C/C++

➣ Kompilator języka C i C++ w systemie Unix – program cc


➣ Kompilator na warunkach licencji GNU – program gcc
➣ Kompilacja – tłumaczenie programu źródłowego na język
maszynowy
➣ Wynik kompilacji – moduł wynikowy (obiektowy) *.o
➣ Konsolidacja – zebranie wszystkich modułów wynikowych i
utworzenie modułu wykonywalnego

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 2

Przykładowy program i jego kompilacja

#include <stdio.h>
#include <stdlib.h>

int main(){
printf("Hej, hopla\n");
exit(EXIT_SUCCESS);
}

kompilacja:
$ cc -o hej hej.c
$ hej
Hej, hopla
$ _
brak ustawień w PATH – uruchamianie poprzez dodanie przedrostka ./
$ ./hej

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 3

Opcje kompilatora
✧ o nazwa pliku – generowanie modułu wykonywalnego z określeniem nazwy
pliku wyjściowego; moduły obiektowe są tworzone domyślnie
✧ -c – kompilacja plików źródłowych bez konsolidacji; dla każdego pliku
źródłowego tworzy odrębny plik obiektowy
✧ Ikataklog – wstawia katalog na początek listy katalogów, które będą
przeszukiwane w celu odnalezienia plików nagłówkowych
✧ Lkatalog – wstawia katalog na początek listy katalogów, które będą
przeszukiwane w celu odnalezienia bibliotek
✧ lfoo – dołącza bibliotekę libfoo
✧ -static – dołączanie tylko bibliotek statycznych
✧ -g, -ggdb – włączanie informacji dla programu śledzącego; opcja -g włącza
standardowy zbiór informacji, opcja -ggdb – rozszerzony
✧ -Wall – wypisanie wszystkich ogólnie użytecznych ostrzeżeń jakie może podać
kompilator

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 4

Pliki nagłówkowe
Standardowo w katalogu /usr/include
Dołączanie plików nagłówkowych z niestandardowych miejsc: opcja -I , np.:
$ cc -I/usr/openwin/include fred.c
Wyszukiwanie łańcucha znaków w plikach nagłówkowych, np. używając grep :
$ grep EXIT_ *.h
stdlib.h:#define EXIT_FAILURE 1
stdlib.h:#define EXIT_SUCCESS 0

Biblioteki

standardowo w katalogach:
/lib
/usr/lib
*.a – biblioteki statyczne
*.so lub *.sa – biblioteki dzielone
Instytut Sterowania i Systemów Informatycznych
Uniwersytet Zielonogórski
Narzędzia programisty 5

dołączanie bibliotek:
$ cc fred.c /usr/lib/libm.a
$ cc fred.c -lm
$ cc fred.c -L/usr/openwin/lib

Biblioteki statyczne

Zbiór plików obiektowych przechowywanych razem (archiwum)


Tworzenie bibliotek statycznych – polecenia ar i ranlib
Kompilacja funkcji z użyciem przełącznika -c , np.:
$ cc -c fred.c
Dodanie funkcji do archiwum – polecenie ar
ar rcs nazwa bib.a funkcja.o , np:
$ ar rcs moja.a fred.o

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 6

Opcje:
✧ r – włącza do biblioteki plik obiektowy, zastępując stary o tej samej nazwie
✧ c – tworzy bibliotekę jeśli nie istnieje, nie podając żadnych komunikatów
✧ s – uaktualnia tablicę odwzorowującą nazwy symboli na nazwy plików
obiektowych
✧ t – wyświetlenie zawartości biblioteki
✧ d – usunięcie z biblioteki modułu obiektowego o podanej nazwie

Wykorzystanie biblioteki:
$ gcc prog glow.c -o prog1 bib.a
Dystrybucje z Berkeley wymagają jeszcze utworzenia tablicy zawartości
biblioteki poleceniem ranlib :
$ ranlib nazwa bib.a

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 7

Biblioteki dzielone

Zalety:
✓ współdzielenie kodu przez wiele procesów
✓ oszczędność pamięci (operacyjnej i dyskowej)
✓ łatwość wprowadzanie poprawek

Wady:
✗ większa złożoność budowy
✗ problem zachowania zgodności z poprzednimi wersjami
✗ rozpowszechnianie: aplikacja + biblioteki dzielone

Biblioteki niezbędne do uruchomienia aplikacji? – polecenie ldd


$ ldd mc
libc.so.6 => /lib/libc.so.6 (0x40070000)

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 8

Projektowanie bibliotek dzielonych

➣ Zarządzanie zgodnością
nazwa biblioteki (ang. soname) (nazwa + numer wersji), np. libc.so.5
programiści tworzą zazwyczaj inne nazwy: /libc.so.5.12.9 ,
ale aplikacje odwołują się do /lib/libc.so.5
➣ tworzenie bibliotek niezgodnych
najlepiej zmienić nazwę: libc.so.6
➣ projektowanie bibliotek zgodnych
nie zmieniać definicji, interfejsów istniejących funkcji – dodawać nowe
nie zmieniać zachowania funkcji wykraczającego poza specyfikację
do definicji struktur eksportowalnych, pozycje dodawać tylko na końcu
struktur

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 9

➣ Realizacja
kompilacja z opcją -fPIC (position independent mode)
łączenie biblioteki (gcc nie ld ):
gcc -shared -Wl,-soname, nazwa wew -o nazwa bib
lista plików lista bibliotek
✧ -shared – opcja określająca obiekt dzielony
✧ -Wl – opcja przekazująca do konsolidatora nazwę wewnętrzną biblioteki
nazwa wew ; przecinki są zamieniane na spacje w trakcie konsolidacji
✧ nazwa bib – pełna nazwa biblioteki z numerem wersji
✧ lista plików – lista plików obiektowych
✧ lista bibliotek – lista innych bibliotek potrzebnych do kompilacji
programu

Przykład
gcc -shared -Wl,-soname,libcoś.so.1 -o libcoś.so.1.0.1 coś.o
inny.o -lc

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 10

➣ Instalacja – polecenie ldconfig


skopiuj bibliotekę do katalogu docelowego
jeśli nie chcesz podawać opcji -Lkatalog w programie łączącym to zainstaluj
bibliotekę w katalogu /usr/lib lub utwórz tam dowiązanie symboliczne
nazwabib.so do biblioteki (korzystaj z dowiązania względnego a nie
bezwzględnego!)
jeśli chcesz, aby program łączący odnalazł bibliotekę bez instalowania jej w
systemie utwórz dowiązanie nazwa bib.so w bieżącym katalogu. Następnie
użyj opcji -L. – bibliotek należy szukać w katalogu bieżącym
jeśli pełna ścieżka do biblioteki nie figuruje w /etc/ld.so.conf dodaj ją;
każda ścieżka powinna figurować w osobnym wierszu
uruchom ldconfig

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 11

Biblioteka dzielona – przykład


/* libhopla.c
dostarcza funkcję print_hopla() dla bib. libhopla.so */
#include <stdio.h>

void print_hopla(void){
printf("Hej hopla!\n");
}

/* uzyj_hopla.c
korzysta z funkcji print_hopla() z bib. libhopla.so */
#include "libhopla.h"

int main(void){
print_hopla();
return 0;
}
Instytut Sterowania i Systemów Informatycznych
Uniwersytet Zielonogórski

Narzędzia programisty 12

Poszczególne etapy tworzenia biblioteki

1. gcc -fPIC -Wall -g -c libhopla.c


2. gcc -g -shared -Wl,-soname,libhopla.so.0 -o
libhopla.so.0.0 libhopla.o -lc
3. ln -sf libhopla.so.0.0 libhopla.so.0
4. ln -sf libhopla.so.0 libhopla.so
5. stwórz plik nagłówkowy libhopla.h
6. gcc -Wall -g -c uzyj hopla.c -o uzyj hopla.o
7. gcc -g -o uzyj hopla uzyj hopla.o -L. -lhopla
8. LD LIBRARY PATH=‘pwd‘ ./uzyj hopla

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 13

Korzystanie z bibliotek dzielonych


Ładowanie dynamiczne (<dlfcn.h> )
1. otwarcie biblioteki – dlopen()
2. wyszukanie symbolu – dlsym()
3. obsługa
4. zamknięcie biblioteki – dlclose()
Wykorzystywanie niezainstalowanych bibliotek: LD LIBRARY PATH
#!/bin/sh
export LD_LIBRARY_PATH=/usr/local/netscape/lib:
$LD_LIBRARY_PATH
exec /usr/local/netscape/lib/netscape $*
wstępne ładowanie — umożliwia zamianę kilku funkcji z zainstalowanej
biblioteki


LD PRELOAD


/etc/ld.so.preload

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 14

Przykład ładowania dynamicznego

/* uzyj2_hopla dynamicznie załaduj print_hopla() z libhopla.so */

#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>

typedef void(*hopla_fun)(void);

int main(void){

void *library;
hopla_fun hopla;
const char *error;

library = dlopen("libhopla.so", RTLD_LAZY);


if(library == NULL){
fprintf(stderr, "Nie mogę załadować biblioteki libhopla.so: %s\n", dlerror());
exit(1);
}

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 15

dlerror();
hopla = dlsym(library, "print_hopla");

error = dlerror();

if(error){
fprintf(stderr, "Nie mogę znaleźć funkcji
print_hopla(): %s\n", dlerror());
exit(1);
}

(*hopla)();
dlclose(library);
return(0);
}

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 16

Zagadnienie wielu plików źródłowych

/* main.c */
#include "a.h"
#define EXIT_SUCCESS 0

extern void function_two();


extern void function_three();

int main() {
function_two();
function_three();
exit (EXIT_SUCCESS);
}

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 17

/* 2.c */
#include "a.h"
#include "b.h"

void function_two() {
}

/* 3.c */
#include "b.h"
#include "c.h"

void function_three() {
}

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 18

ZARZĄDZANIE PROJEKTAMI

Program make (S.I.Feldman, ok. 1975)


➣ Własność: AT&T, public domain
➣ Automatyzacja i optymalizacja konstruowanego oprogramowania:
sterowanie kompilacją kodu źródłowego
✧ ułatwia rozwiązanie problemu wielu plików źródłowych
✧ kompiluje tylko te pliki, które uległy zmianie
przygotowanie stron elektronicznego podręcznika
instalacja aplikacji
➣ makefile – plik opisujący czynności, które ma wykonać make

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 19

Często używane parametry polecenia make


-k kontynuuje działanie, mimo wykrytego błędu – przydatne, aby w
jednym przejściu dowiedzieć się, które pliki źródłowe się nie kom-
pilują
-n wypisuje co ma do wykonania (polecenia)
-f plik wskazuje jakiego pliku używać jako makefile

Budowa pliku makefile


Plik makefile składa się z:
reguł definiujących co ma zrobić make
zależności opisujących jak ma to zrobić
(linie zależności muszą zaczynać się tabulatorem)

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 20

Przykład 1. Przykład pliku makefile


myapp: main.o 2.o 3.o
gcc -o myapp main.o 2.o 3.o

main.o: main.c a.h


gcc -c main.c

2.o: 2.c a.h b.h


gcc -c 2.c

3.o: 3.c b.h c.h


gcc -c 3.c

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 21

Przykład 2. makefile z komentarzami i makrami

all: myapp

# Which compiler
CC = gcc

# Where are include files kept


INCLUDE = .

# Options for development


CFLAGS = -g -Wall -ansi

# Options for release


# CFLAGS = -O -Wall -ansi

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 22

myapp: main.o 2.o 3.o


$(CC) -o myapp main.o 2.o 3.o

main.o: main.c a.h


$(CC) -I$(INCLUDE) $(CFLAGS) -c main.c

2.o: 2.c a.h b.h


$(CC) -I$(INCLUDE) $(CFLAGS) -c 2.c

3.o: 3.c b.h c.h


$(CC) -I$(INCLUDE) $(CFLAGS) -c 3.c

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 23

Przykład 3. makefile z dołączonymi wieloma opcjami


all: myapp ...

...

clean:
-rm main.o 2.o 3.o

install: myapp
@if [ -d $(INSTDIR) ]; \
then \
cp myapp $(INSTDIR);\
chmod a+x $(INSTDIR)/myapp;\
chmod og-w $(INSTDIR)/myapp;\
echo "Installed in $(INSTDIR)";\
else \
echo "Sorry, $(INSTDIR) does not exist";\
fi

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 24

Wywołanie programu
make – wykonanie etykiety all
make clean – wykonanie etykiety clean
make install ... – wykonanie etykiety install

Inne możliwości polecenia make


reguły wbudowane (patrz make -p )
reguły przyrostków
zarządzanie bibliotekami

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 25

Przykład 4. Reguła przyrostkowa zamieniająca pliki *.cpp na *.o


all: myapp

.SUFFIXES: .cpp

.cpp .o:
$(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<

...

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 26

Przykład 5. makefile do zarządzania biblioteką


all: myapp

# Which compiler
CC = gcc

# Where to install
INSTDIR = /usr/local/bin

# Where are include files kept


INCLUDE = .

# Options for development


CFLAGS = -g -Wall -ansi

# Options for release


# CFLAGS = -O -Wall -ansi
Instytut Sterowania i Systemów Informatycznych
Uniwersytet Zielonogórski
Narzędzia programisty 27

# Local Libraries
MYLIB = mylib.a

myapp: main.o $(MYLIB)


$(CC) -o myapp main.o $(MYLIB)

$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)

main.o: main.c a.h

2.o: 2.c a.h b.h

3.o: 3.c b.h c.h

clean:
...

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 28

EDYTORY

Edytor emacs

➣ Twórca pierwszej wersji edytora GNU Emacs – Richard Stallman


➣ Popularny edytor występujący w wielu odmianach
➣ Dostęp do poleceń za pomocą skrótów klawiszowych i menu
➣ Istnieje możliwość wykorzystania myszy
➣ Duży edytor stanowiący prawdziwe środowisko programistyczne
➣ Oferuje tryb śledzenia

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 29

Edytor vi
➣ Edytor vi jest najbardziej popularnym edytorem, dostępnym w każdym
systemie uniksowym
➣ Nazwa vi wywodzi się od nazwy visual interface -– wizualny interfejs
➣ Obsługa edytora wykonywana jest jedynie za pomocą klawiatury, użytkownik
w żaden sposób nie wykorzystuje myszy
➣ vi jest edytorem modalnym – pracującym w kilku trybach (środowiskach
pracy). W różnych trybach naciśnięcie tego samego klawisza interpretowane
jest w inny sposób
➣ Działanie edytora jest zależne od terminala, komputera, czy systemu, w
którym jest wykonywany

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 30

% vi
ekran zostanie wyczyszczony
na początku każdej linii pojawi się znak tyldy
kursor znajdzie się w lewym górnym rogu

-- WPROWADZANIE -- 1.1

po wpisaniu ":" kursor automatycznie przeniesie się w dolny lewy róg ekranu
wpisujemy q i potwierdzamy (Enter)
polecenie zamyka edytor i przekazuje sterowanie systemowi operacyjnemu

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 31

Poruszanie kursorem
h – przesuwanie w lewo (kursor  )
l – przesuwanie w prawo (kursor  )
j – przesuwanie w dół (kursor )


k – przesuwanie w górę (kursor ) 

Enter – przechodzenie do kolejnej linii


Backspace – przesuwanie kursora w lewo
0 – przejście na początek linii
$ – przejście na koniec linii
w – przesunięcie kursora o jedno słowo w prawo (ignoruje znaki specjalne)
b – przesunięcie kursora o jedno słowo w lewo (ignoruje znaki specjalne)
W – przesunięcie kursora o jedno słowo w prawo
B – przesunięcie kursora o jedno słowo w lewo

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 32

Wstawianie tekstu do pliku

Poruszanie się po pliku jest bardzo przydatne, ale zadaniem edytora tekstu
jest wstawianie i usuwanie informacji zawartej w pliku
Modyfikacji zawartości pliku dokonuje się w tzw. trybie wstawiania
Tryb wstawiania można włączyć na cztery sposoby:
1. i – wstawianie (ang. insert)
2. a – dopisywanie (ang. append)
3. o – wstawianie wiersza poniżej bieżącego i ustawienie kursora na jego
początku (ang. open)
4. O – wstawianie wiersza powyżej bieżącego i ustawienie kursora na jego
początku

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 33

Przykład 6. Edycja nowego, nieistniejącego pliku % vi nowy plik

"nowy plik" [New file]

Plik nie został jeszcze stworzony. Informuje nas o tym komunikat ”New file”
Aby przejść do trybu wstawiania należy wcisnąć klawisz i, a, o lub O
Powrót z trybu edycji do trybu poleceń – klawisz ESC

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 34

Po przejściu do trybu wprowadzania i wpisaniu kilku linii tekstu...

Próbujemy nauczyc sie obsługi edytora vi. Nauka idzie ciezko, ale w
koncu sie nauczymy. Edytor vi jest najbardziej popularnym edytorem
uniksowym.


-- Insert --

Będąc w trybie poleceń można zapisać zmiany w pliku poprzez wprowadzenie


polecenia ":w"
Jeżeli po modyfikacji pliku wpiszemy polecenie ":q" system poinformuje nas,
że w pliku dokonano zmian i wypadałoby go zapisać

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 35

Kasowanie tekstu

x -– podstawowe polecenie do kasowania znaków. Usuwa znak na którym


aktualnie znajduje się kursor
d – polecenie adresujące
✧ dd – usuwa całą linię
✧ dw – usuwa bieżący wyraz
✧ db - usuwa wyraz znajdujący się przed bieżącym

D – usuwa linie tekstu i ustawia się na początku pustej linii


u - odtworzenie uprzednio skasowanego tekstu
U – cofanie wszelkich zmian wprowadzonych w obrębie danego wiersza.

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 36

Przeszukiwanie pliku

Przy dużych plikach istnieje potrzeba opracowania polecenia lub poleceń


służących do wyszukiwania potrzebnej informacji w zawartości pliku
/wzorzec - po ukośniku podaje się szukany tekst. Jeżeli wzorzec występuje w
pliku wielokrotnie, to można powtórzyć operację naciskając klawisz n .
Przeszukiwanie rozpoczyna się od bieżącej lokalizacji kursora
?wzorzec – polecenie rozpoczyna poszukiwanie wzorca w pliku w kierunku
odwrotnym, tzn. od bieżącej lokalizacji w górę
liczbaG - przejście do wiersza pliku określonego przez liczbę. Jeżeli numer
wiersza nie zostanie podany, kursor zostanie przesunięty do ostatniego wiersza
w pliku

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 37

Polecenia dwukropkowe
Polecenie Funkcja
:e nazwa pliku przerywa edycję bieżącego pliku i rozpoczyna edycję pliku
o podanej nazwie
:n przerywa edycję bieżącego pliku i rozpoczyna edycję na-
stępnego, którego nazwa została podana w wierszu pole-
ceń
:q zakończenie pracy z edytorem
:q! wyjście z edytora bez względu na fakt czy w edytowanym
pliku dokonano zmian czy nie
:r nazwa pliku wstawia zawartość podanego pliku do tego, który jest ak-
tualnie edytowany (w bieżącej pozycji kursora)
:w zapisuje plik na dysku
:w nazwa pliku zapisuje plik na dysku o podanej nazwie

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 38

Dostęp do poleceń Uniksa z poziomu edytora vi


Za pomocą dwukropkowego polecenia :! można korzystać z poleceń systemu
operacyjnego bez potrzeby kończenia edycji pliku i zamykania edytora vi


:! ls -l

total 258
-rw------- 1 kpatan 3843 Mar 31 11:05 dane.txt
-rw-rw-r-- 1 kpatan 123768 Mar 31 12:42 mail.list
-rw-rw---- 1 kpatan 102 Apr 1 12:47 copy.list
-rwxr-x--- 1 kpatan 4368 Apr 1 17:45 skrypt.c
[Hit any key to continue]

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 39

Systemy kontroli wersji

➣ SCCS (Source Code Control System)


➣ RCS (Revision Control System)
➣ CVS (Concurrent Version System)
Zalety:


zarządzanie repozytorium


śledzenie zmian w plikach źródłowych




zapamiętywanie wszystkich zmian w źródłach




pomocne w pracy zespołowej

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 40

Polecenia systemu SCCS

admin dodaj plik do SCCS


comb połącz dwie wersje pliku SCCS
delta utwórz nową wersję pliku SCCS
get pobierz plik z SCCS
prs drukuj opis pliku SCCS
rmdel usuń różnice z pliku SCCS
sccsdiff porównaj dwie wersje pliku SCCS
val uaktualnij plik SCCS
what szukaj i wyświetl wzorzec w pliku SCCS

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 41

Programy śledzące (debugery)

Program gdb (db)




kompilacja z opcją -ggdb




uruchomienie debugera gdb program




Polecenia debugera

run, r uruchamia program od początku


step, s wykonuje program instrukcja po instrukcji
where, w wypisuje zawartość stosu
break, b ustawia punkt przerwania
clear usuwa punkt przerwania

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 42

Narzędzia do kontroli pamięci

➣ Electric Fence
➣ Checker
➣ mpr
➣ Darmowe oprogramowanie dostępne pod adresem URL
ftp://sunsite.unc.edu/pub/Linux/devel/lang/c

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 43

Przykład 6. Niepoprawny program


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char global[5];

int main(void){
char * dyn;
char local[5];
/* nieznacznie przekrocz rozmiar bufora */
dyn = malloc(5);
strcpy(dyn, "12345");
printf("1: %s\n", dyn);
free(dyn);
/* znacznie przekrocz rozmiar bufora */
dyn = malloc(5);
strcpy(dyn, "12345678");
printf("2: %s\n", dyn);

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 44

/* wyjdź poza zarezerwowaną pamięć */


*(dyn - 1) = ’\0’;
printf("3: %s\n", dyn);
/* nie zwalniam pamięci */

/* wyjdź poza zmienną lokalną */


strcpy(local, "12345");
printf("4: %s\n", local);
local[-1] = ’\0’;
printf("5: %s\n", local);

/* zaatakuj przestrzeń globalną */


strcpy(global, "12345");
printf("6: %s\n", global);
global[-1] = ’\0’;
printf("7: %s\n", global);
exit(EXIT_SUCCESS);

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 45

Uruchomienie i wyniki działania programu

$ gcc -Wall -o deb deb.c


$ ./deb
1: 12345
2: 12345678
3: 12345678
4: 12345
5: 12345
6: 12345
7: 12345

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 46

Electric Fence

✓ Wykrywanie przepełnień buforów


✗ Niemożność wykrycia wycieków pamięci
➣ Program zastępuje funkcję malloc() z biblioteki C, nową wersją
1. rezerwuje żądany obszar pamięci i następujący po nim fragment
pamięci
2. do dodatkowego fragmentu pamięci proces nie ma dostępu
3. próba odwołania się do tego obszaru powoduje zatrzymanie
procesu przez jądro z błędem ochrony pamięci
➣ Więcej informacji – man libefence

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 47

Użycie Electric Fence

➣ Do kodu programu należy dodać bibliotekę libefence.a :

gcc -o program zrodlo.c -lefence


➣ Program informuje o błędzie, ale nie wskazuje dokładnie miejsca
jego wystąpienia
➣ Błąd ten łatwo można wyśledzić za pomocą programu śledzącego
gdb
➣ W tym celu kompilację należy przeprowadzić nstępująco:

gcc -ggdb -Wall -o program zrodlo.c -lefence

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 48

Właściwości

➣ W przykładowym programie pierwsze przepełnienie nie zostanie


wykryte
➣ Spowodowane jest to zjawiskiem ”wyrównania pamięci”


implementacje funkcji malloc() zwracają obszar pamięci,


którego pierwszy bajt jest wyrównywany do rozmiaru słowa (8
bajtów dla procesorów 64 bitowych)


domyślnie Electric Fence dostarcza funkcję malloc() , która


zwraca adresy będące parzystą wielokrotnością sizeof(int)
➣ Aby wykryć pierwsze przepełnienia należy zmiennej środowiskowej
EF ALIGMENT nadać wartość 1

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 49

➣ Program umożliwia także wykrywanie:


1. prób dostępu do pamięci przed początkiem zajętego bufora
2. prób dostępu do pamięci która została już zwolniona
➣ Jeżeli EF PROTECT BELOW=1 – program wykrywa próby dostępu
przed początkiem zajętego bufora
➣ Jeżeli EF PROTECT FREE=1 – funkcja free() nie będzie zwalniać
przekazanego obszaru pamięci, a uczyni go niedostępnym. W
efekcie jądro będzie wykrywać próby dostępu do tego obszaru
➣ Program nie pomaga w rozwiązywanie problemów z lokalnymi i
globalnymi obszarami danych

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 50

Checker

➣ Pomaga w wyszukiwaniu przepełnień buforów i wycieków pamięci


➣ Zamiast kompilatora gcc należy wykorzystywać program
checkergcc
➣ Wynikowy program sam będzie śledził swoje wykonanie
➣ Kompilacja
checkergcc -o program zrodlo.c
Wyszukiwanie wycieków pamięci

➣ Działanie programu sterowane jest zmienną CHECKEROPTS


--detector=end – wykrywacz wycieków pamięci należy uruchmić
po zakończeniu programu
Instytut Sterowania i Systemów Informatycznych
Uniwersytet Zielonogórski
Narzędzia programisty 51

Wyszukiwanie przepełnień

➣ Uruchomienie programu skompilowanego za pomocą checkergcc


spowoduje wygenerowanie raportu o wszystkich błędach
➣ Aplikacja pomaga w poszukiwaniu prób pisania poza końcem stosu
➣ Jeżeli po zmiennej buf zostanie zarezerwowana jakaś inna zmienna
to checker nie pomoże w wykryciu przepełnienia zmiennej bufor
➣ Program nie umożliwia wykrycia problemów ze zmiennymi
globalnymi

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 52

Program mpr

➣ Program rejestruje wszystkie wywołania funkcji malloc() i


free()
➣ Na podstawie dopasowania każdego zarezerwowania pamięci i jej
zwolnienia wyszukiwane są wycieki pamięci
➣ Program pomaga w wyszukiwaniu naruszeń obszarów pamięci
➣ mpr zastępuje funkcję malloc() swoją własną wersją – dokonuje
się tego za pomocą funkcji mcheck()
➣ Do kodu programu należy dołączyć bibliotekę libmpr.a gcc
-ggdb -o program zrodlo.c -lmpr
➣ Po kompilacji, sprawdzanie pamięci za pomocą mcheck()
włączane jest automatycznie
Instytut Sterowania i Systemów Informatycznych
Uniwersytet Zielonogórski
Narzędzia programisty 53

Wyszukiwanie naruszeń obszarów pamięci

➣ Program umieszcza znaną sekwencję bajtów przed i za


rezerwowanym obszarem
➣ Funkcja free() szuka tych sygnatur i jeżeli zostały naruszone
wywołuje funkcję abort()
➣ Metoda mcheck() nie lokalizuje dokładnie pojaiwenia się
naruszenia
➣ Znalezienie błędu jest możliwe za pomocą programu śledzącego
gdb
➣ Program nie pomaga w wyszukiwaniu przepełnień zmiennych
lokalnych i globalnych, a tylko obszarów zarezerwowanych funkcją
malloc()
Instytut Sterowania i Systemów Informatycznych
Uniwersytet Zielonogórski

Narzędzia programisty 54

Wyszukiwanie wycieków pamięci

➣ Należy ustawić dwie zmienne środowiskowe MPRPC i MPRFI


➣ MPRPC
przechowuje wartości potrzebne do prawidłowego poruszania się po ciągu
wywołań funkcji podczas tworzenia raportu
zmienną ustawia się w następujący sposób
export MPRPC=‘mprpc program‘

➣ MPRFI
instruuje za pomocą jakiego programu ma być generowany raport
dla małych plików: export MPRFI=‘cat > mpr.log‘
dla dużych plików: export MPRFI=‘gzip > mpr.log.gz‘

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 55

➣ Po wygenerowaniu raportu można go przeanalizować za pomocą


poleceń:


mpr program – tłumaczy adresy programu w raporcie na


nazwy funkcji i miejsca w kodzie źródłowym


mprcc – dla każdego ciągu wywołań który rezerwował pamięć,


funkcja wyświetla liczbę wykonanych rezerwacji i całkowitą
liczbę zarezerwowanych bajtów


mprlk – plik raportu jest analizowany pod kątem wszystkich


zarezerwowanych obszarów, które nie zostały zwolnione.
Generuje nowy raport zawierający rezerwacje powodujące
wycieki pamięci
mprlk < mpr.log | mpr program

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 56

Profilowanie

➣ Polecenie prof – dokładna analiza efektywności programu


➣ prof (gprof ) drukuje raport z pliku śledzenia przebiegu
programu – należy dołączyć opcje -p podczas kompilacji:
cc -p -o program program.c
➣ Dane z monitorowania zapisane są w pliku mon.out (gmon.out
dla gpof )
➣ Informacje generowane przez prof są zupełnie innego rodzaju niż
te generowane przez programy śledzące

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 57

Przykład. Analiza pliku monitorowania przez gprof


Flat profile:
Each sample counts as 0.01 seconds.
no time accumulated
% cumulative self self total
time seconds seconds calls Ts/call Ts/call name
0.00 0.00 0.00 1 0.00 0.00 sort
Call graph
granularity: each sample hit covers 4 byte(s) no time propagated
index % time self children called name
0.00 0.00 1/1 main [11]
[1] 0.0 0.00 0.00 1 sort [1]
-----------------------------------------------

Index by function name


[1] sort

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 58

Elektroniczny podręcznik

Typowa strona elektronicznego podręcznika zawiera:


nagłówek
nazwę
streszczenie
opis
opcje
pliki
zobacz także
błędy

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 59

➣ Plik kompiluje się za pomocą polecenia groff


➣ Kompilacja pliku moja app.1 zawierającego elektroniczny
podręcznik
groff -Tascii -man moja app.1
lub
groff -Tps -man moja app.1
➣ Opcje:
-Tascii – wygenerowanie podręcznika w postaci kodu ascii


-Tps – wygenerowanie podręcznika w postaci pliku ps




-man – wygenerowanie podręcznika w postaci standardowej




Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 60

➣ Przykładowe znaczniki:
.TH – tytuł strony man: .TH tytuł sekcja

.SH – paragraf: .SH nazwa paragrafu

.TP – paragraf wcięty

.PP – linia odstępu

.B – tekst pogrubiony

.I – tekst pisany kursywą

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 61

Przykład
.TH MYAPP 1

.SH NAME
Myapp \- A simple demonstration application that does very little.

.SH SYNOPSIS
.B myapp
[\-option ...]

.SH DESCRIPTION
.PP
\fImyapp\fP is a complete application that does nothing useful.

.PP
It was written for demonstration purposes.

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

Narzędzia programisty 62

.SH OPTIONS
.PP
It doesn’t have any, but lets pretend, to make this template:

.TP
.BI \-option
If there was an option, it would not be -option.

...

.SH AUTHORS
Neil Matthew and Rick Stones

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 63

➣ Elektroniczny podręcznik po kompilacji

MYAPP(1) MYAPP(1)

NAME
Myapp - A simple demonstration application that does very little.

SYNOPSIS
myapp [-option ...]

DESCRIPTION
myapp is a complete application that does nothing useful.

It was written for demonstration purposes.


Instytut Sterowania i Systemów Informatycznych
Uniwersytet Zielonogórski

Narzędzia programisty 64

OPTIONS
It doesn’t have any, but lets pretend, to make this template:

-option
If there was an option, it would not be -option.

AUTHORS
Neil Matthew and Rick Stones

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski
Narzędzia programisty 65

Środowiska programistyczne

➣ xwpe
➣ kdevelop
➣ kylix
➣ ...

Instytut Sterowania i Systemów Informatycznych


Uniwersytet Zielonogórski

You might also like