Professional Documents
Culture Documents
Krzysztof Patan
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
Narzędzia programisty 2
#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
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
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
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
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
Narzędzia programisty 8
➣ 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
➣ 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
Narzędzia programisty 10
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
LD PRELOAD
/etc/ld.so.preload
Narzędzia programisty 14
#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;
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);
}
Narzędzia programisty 16
/* main.c */
#include "a.h"
#define EXIT_SUCCESS 0
int main() {
function_two();
function_three();
exit (EXIT_SUCCESS);
}
/* 2.c */
#include "a.h"
#include "b.h"
void function_two() {
}
/* 3.c */
#include "b.h"
#include "c.h"
void function_three() {
}
Narzędzia programisty 18
ZARZĄDZANIE PROJEKTAMI
Narzędzia programisty 20
all: myapp
# Which compiler
CC = gcc
Narzędzia programisty 22
...
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
Narzędzia programisty 24
Wywołanie programu
make – wykonanie etykiety all
make clean – wykonanie etykiety clean
make install ... – wykonanie etykiety install
.SUFFIXES: .cpp
.cpp .o:
$(CC) -xc++ $(CFLAGS) -I$(INCLUDE) -c $<
...
Narzędzia programisty 26
# Which compiler
CC = gcc
# Where to install
INSTDIR = /usr/local/bin
# Local Libraries
MYLIB = mylib.a
clean:
...
Narzędzia programisty 28
EDYTORY
Edytor emacs
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
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
Poruszanie kursorem
h – przesuwanie w lewo (kursor )
l – przesuwanie w prawo (kursor )
j – przesuwanie w dół (kursor )
Narzędzia programisty 32
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
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
Narzędzia programisty 34
Próbujemy nauczyc sie obsługi edytora vi. Nauka idzie ciezko, ale w
koncu sie nauczymy. Edytor vi jest najbardziej popularnym edytorem
uniksowym.
-- Insert --
Kasowanie tekstu
Narzędzia programisty 36
Przeszukiwanie pliku
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
Narzędzia programisty 38
:! 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]
zarządzanie repozytorium
Narzędzia programisty 40
Polecenia debugera
Narzędzia programisty 42
➣ Electric Fence
➣ Checker
➣ mpr
➣ Darmowe oprogramowanie dostępne pod adresem URL
ftp://sunsite.unc.edu/pub/Linux/devel/lang/c
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);
Narzędzia programisty 44
Narzędzia programisty 46
Electric Fence
Narzędzia programisty 48
Właściwości
Narzędzia programisty 50
Checker
Wyszukiwanie przepełnień
Narzędzia programisty 52
Program mpr
Narzędzia programisty 54
➣ 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‘
Narzędzia programisty 56
Profilowanie
Narzędzia programisty 58
Elektroniczny podręcznik
Narzędzia programisty 60
➣ Przykładowe znaczniki:
.TH – tytuł strony man: .TH tytuł sekcja
.B – tekst pogrubiony
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.
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
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.
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
Środowiska programistyczne
➣ xwpe
➣ kdevelop
➣ kylix
➣ ...