Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A...

43
Programmierwerkzeuge Projektmanagement im So2warebereich – SeqAn David Weese April 2009

Transcript of Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A...

Page 1: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

Programmierwerkzeuge

ProjektmanagementimSo2warebereich–SeqAn

DavidWeeseApril2009

Page 2: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

Inhalt

• BuildSytem|make

• Debugger|gdb,ddd

• Entwicklungsumgebung|VisualStudio

• Profiler|gprof

• MemoryDebugger|valgrind

• WeitereTools|doxygen,svn

• BugTracker|trac

EinigeFolienentstammendemKursvonMaHhiasNeubauer:hHp://sommercampus2004.informaOk.uni‐freiburg.de/ProgrammierwerkzeugeKurs

Page 3: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

BUILDSYSTEM

Page 4: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

ProgrammbaumitMake:

• ÄnderungenimplizierenoTmehrereZwischenschriHe,umdasProgramm/Produktzubauen:

• ÜbersetzenvonQuelldateieninObjektdateien• BindenvonObjektdateienzuausführbarenProgrammen

• ErzeugenderDokumentaOonausdenQuelldateien

• ZwischenschriHekönnenvonanderenabhängen(Abhängigkeitsgraph)

Makefilesdefinieren:• welcheKomponentenesgibt

• wovonsieabhängen

• SchriHezurKonstrukOonderKomponenten

Allgemeines

Page 5: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• füreineodermehrereKomponenten

• Abhängigkeiten

• Befehle

ziel1 ziel2 … zieln: quelle1 quelle2 … quellem kommando1 kommando2 kommando3 …

*KommandosmüssenmitTABSeingerücktsein!

Makefile:Regeln

Page 6: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• ProgrammdudenbestehtauszweiKomponenten:grammaOk.cundwoerterbuch.c

• FürbeideKomponenten:C‐QuelldateiwirdmitHilfevonccinObjektdateiübersetzt

• BindenderObjektdateienzumausführbarenProgramm

Zutunwäre:

cc grammatik.c -c -o grammatik.occ woerterbuch.c -c -o woerterbuch.occ grammatik.o woerterbuch.o -o duden

Beispiel:duden

Page 7: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

duden: grammatik.o woerterbuch.o cc grammatik.o woerterbuch.o -o duden

grammatik.o: grammatik.c cc grammatik.c -c -o grammatik.o

woerterbuch.o: woerterbuch.c cc woerterbuch.c -c -o woerterbuch.o

clean: rm grammatik.o woerterbuch.o duden

Makefilefürduden

Page 8: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

duden: grammatik.o woerterbuch.o cc grammatik.o woerterbuch.o -o duden

clean: rm grammatik.o woerterbuch.o duden

oderkürzer(impliziteRegeln)

Page 9: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• BerechneAbhängigkeitsgraph

• FürZielkomponenteA

‐ besOmmeKomponentenA1,…,AnvondenenAabhängt

‐ rufeAlgorithmusfüralleAirekursivauf

‐ fallsAnichtexisOert,odereinAineugebaut/verändertwurde:erzeugeAmitKommandos

• ErkennenvonÄnderungeneinerDatei

‐ DatumderletztenÄnderungwirdverwaltet

‐ Dateigeändert,fallsjüngeralsvonihrabhängigeKomponente

FunkOonsweisevonmake

Page 10: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• Variablenvar=wert

• Referenzierungdurch$(var)

• ImpliziteRegeln• DefiniOonvonStandardregelnfürKomponentenmitbest.

Namensmuster

• Vordefiniertistbspw:

.c.o:

$(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< • ImpliziteVariablenfürerstesZiel$@ oderQuelle $<

• If‐AnweisungenundMakros

GNUMakeManual‐hHp://www.gnu.org/soTware/make/manual/

Featuresvonmake

Page 11: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

DEBUGGER

Page 12: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• EinDebuggerführteinProgrammkontrolliertaus

‐ ProgrammindefinierterUmgebungausführen‐ ProgrammunterbesOmmtenBedingungenanhaltenlassen

‐ ZustandeinesangehaltenenProgrammsuntersuchen

‐ ZustandeinesangehaltenenProgrammsverändern

• GNUDebuggergdb

‐ interakOvesProgrammmitKommandozeilensteuerung• DataDisplayDebuggerddd

‐ graphischeBenutzeroberflächezugdb

Programmbeispiel:

• EssollenZahlenvonderKommandozeileeingelesen,sorOertundwiederausgegebenwerden

Fehlersuchemitgdbundddd

Page 13: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

Beispielprogrammsample.c

#include<stdio.h>

#include<stdlib.h>

voidshell_sort(inta[],intsize){

inti,j;

inth=1;

do{

h=h*3+1;

}while(h<=size);

do{

h/=3;

for(i=h;i<size;i++){

intv=a[i];

for(j=i;j>=h&&a[j‐h]>v;j‐=h)

a[j]=a[j‐h];

if(i!=j)

a[j]=v;

}

}while(h!=1);

}

intmain(intargc,char*argv[]){

int*a;

inti;

a=(int*)malloc((argc‐1)*sizeof(int));

for(i=0;i<argc‐1;i++)

a[i]=atoi(argv[i+1]);

shell_sort(a,argc);

for(i=0;i<argc‐1;i++)

priny("%d",a[i]);

priny("\n");

free(a);

return0;

}

Page 14: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• Manchmalgeht’s:

$ ./sample 1 8 5 3 4 71 3 4 5 7 8$

• undmanchmalnicht:

$ ./sample 1 8 5 3 40 1 3 4 5$

Ausführungvonsample

Page 15: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• ÜbersetzenmitDebugging‐Informa/onen:

$ cc –g sample.c –o sample$

• StartenderDebugging‐Sitzung:

$ ddd ./sample&$

• BreakpointinZeile31undrunmit18534alsKommandozeile• View‐>DataWindowanzeigen

• ImDataWindowRechtsklickNewDisplayund*a@6hinzufügen

• SchriHweisedebuggen

Programmedebuggenmitddd

Page 16: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

Ausführungsteuern:

• RunstartetDebugger

• StepführteinzelneZeileausundspringtinSubrouOnen• NextführteinzelneZeileausundüberspringtSubrouOnen

• UnXlspringtausSchleifenraus

• FinishspringtausSubrouOnenzurückzumAufrufer

Variablen/Ausdrückeanzeigen:

• Variableanzeigenprint i

• Arrayelementanzeigen print a[3]

• Dieersten6ElementeeinesArraysanzeigen print a[0]@6

AusdrückekönnenalsNewDisplayimDataWindowhinzugefügtwerden

Debuggersteuern

Page 17: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

shell_sort(a,argc)musszu

shell_sort(a,argc–1)zugeändertwerden.

Sieheda!

Page 18: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• BetriebssystemerlaubtKontrollederProgrammausführung

• VerbindungzwischenProgrammspeicherundOriginalquelltext

‐ Debugging‐InformaOonenenthaltenSymbolnamen,TypinfosundZeilennummern

$ gdb –S –g sample.c$ less sample.s….globl main .type main, @functionmain:.LFB6:

.loc 1 26 0 mainbeginntinZeile26

FunkOonsweisedesgdb

Page 19: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• ÄndernderProgrammausführung

‐ DieKommandosreturnundjump

• ÄnderndesProgrammcodes• Post‐Mortem‐Debugging

‐ UntersuchendesletztenZustandsvorProgrammabsturz

$ gdb ./sample core

gdbDocumentaOon‐hHp://sourceware.org/gdb/documentaOon/

dddDocumentaOon‐hHp://www.gnu.org/manual/ddd/

FeaturesvonDebuggern

Page 20: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

ENTWICKLUNGSUMGEBUNG

Page 21: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

FreiverfügbareC++IDEs:

• MicrosoTVisualStudioExpress(www.microsoT.com)

• Eclipse(www.eclipse.org)• Kdevelop(www.kdevelop.org)

• Xcode(developer.apple.com/tools/xcode/)

• Emacs,Anjuta,...

IDE(IntegratedDevelopmentEnvironment)bestehtaus:• Texteditor

• Compiler

• Linker

• Debugger

Allgemeines

Page 22: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• Express‐Versionfürallefreiverfügbar

• VS2003,VS2005,VS2008freifürStudentenüberFU‐MSDNAA

WiekannmanmitVS:

• einneuesProjektanlegen

• Dateienhinzufügen

• dasProjektkompilieren

• denDebuggerbenutzen

FU‐MSDNAA‐hHps://msdnaa.mi.fu‐berlin.de/MSDNVisualC++Reference‐Übersicht,LanguageReference

VisualStudio

Page 23: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

PROFILER

Page 24: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• Profiler‐Programmierwerkzeuge,diedasLaufzeitverhaltenvonSoTwareanalysieren

• Tuning:systemaOscheSteigerungderLeistungeinesProgramms

• Laufzeitanalyse‐ anwelchenStellensindLeistungssteigerungenmöglich

‐ wassinddieEffekteeinerOpOmierung

GNUProfilergprof

• wertetProgrammprofileaus• ProgrammerstelltProgrammprofilwährenddesProgrammablaufs

• ProgrammprofilgibtfürjedeFunkOonenan

‐ wieoTausgeführt

‐ wielangeausgeführt

Laufzeitanalysemitgprof

Page 25: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• ÜbersetzenmiteingerichteterProfilierung:

$ g++ –pg sample.cpp –o sample$

• StartendesProgramms,ProfilwirdinDateigmon.outgeschrieben:

$ ./sample$ 100000 ints read$

• AnalysierendesProfilsmitgprof:

$ gprof sample$

Sogeht‘s

Page 26: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• gibtan,wiesichdieLaufzeitaufdieeinzelnenFunkOonenverteilt:

Flat profile:

Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls ms/call ms/call name 69.07 0.11 0.11 1 110.51 110.51 shell_sort(int*, int) 31.40 0.16 0.05 1 50.23 50.23 quick_sort(int*, int, 0.00 0.15 0.00 1 0.00 0.00 global constructors 0.00 0.15 0.00 1 0.00 0.00 __static_initializati

DasflacheProfil

Page 28: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

granularity: each sample hit covers 2 byte(s) for 6.22% of 0.16 seconds

index % time self children called name <spontaneous>[1] 100.0 0.00 0.16 main [1] 0.11 0.00 1/1 shell_sort(int*, int) [2] 0.05 0.00 1/1 quick_sort(int*, int, int) [3]----------------------------------------------- 0.11 0.00 1/1 main [1][2] 68.7 0.11 0.00 1 shell_sort(int*, int) [2]----------------------------------------------- 154478 quick_sort(int*, int, int) [3] 0.05 0.00 1/1 main [1][3] 31.2 0.05 0.00 1+154478 quick_sort(int*, int, int) [3] 154478 quick_sort(int*, int, int) [3]----------------------------------------------- 0.00 0.00 1/1 __do_global_ctors_aux [12][10] 0.0 0.00 0.00 1 global constructors keyed to main [1 0.00 0.00 1/1 __static_initialization_and_dest----------------------------------------------- 0.00 0.00 1/1 global constructors keyed to mai[11] 0.0 0.00 0.00 1 __static_initialization_and_destruct-----------------------------------------------

Page 29: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

MEMORYDEBUGGER

Page 30: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• ValgrindisteinleistungsfähigesToolsetfür

‐ Profiling

‐ MemoryDebugging‐ Memory/CacheProfiling

‐ ThreadDebugging

• MemoryDebugger–suchtFehlerimSpeicher‐ManagementvonProgrammen

• ZutestendesProgrammmitDebugging‐InformaOonenübersetzen.(Parameter"‐g"beimgcc)

Speicheranalysemitvalgrind

Page 31: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• ÜbersetzenmitDebugging‐Informa/onen:

$ g++ –g example.cpp –o example$

• StartenderDebugging‐Sitzung:

$ valgrind --leak-check=yes ./example 3$

Sogeht’s

Page 32: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• FehlerhaTerZugriffjenseitsderArray‐Grenzen

Auszugausexample.cpp:

45: int *i = new int[10];46: i[10] = 13;47: cout << i[-1] << endl;48: delete[] i;

Grenzüberschreitung...

Page 33: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

==17056== Invalid write of size 4==17056== at 0x401026: test_3() (example.cpp:46)==17056== by 0x401159: main (example.cpp:135)==17056== Address 0x51E9058 is 0 bytes after a block of size 40 alloc'd

==17056== at 0x4A1B858: malloc (vg_replace_malloc.c:149)==17056== by 0x401019: test_3() (example.cpp:45)==17056== by 0x401159: main (example.cpp:135)==17056== ==17056== Invalid read of size 4==17056== at 0x401034: test_3() (example.cpp:47)==17056== by 0x401159: main (example.cpp:135)==17056== Address 0x51E902C is 4 bytes before a block of size 40 alloc'd

==17056== at 0x4A1B858: malloc (vg_replace_malloc.c:149)==17056== by 0x401019: test_3() (example.cpp:45)==17056== by 0x401159: main (example.cpp:135)0==17056== ==17056== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 8 from 1)==17056== malloc/free: in use at exit: 0 bytes in 0 blocks.==17056== malloc/free: 1 allocs, 1 frees, 40 bytes allocated.==17056== For counts of detected errors, rerun with: -v

==17056== All heap blocks were freed -- no leaks are possible.

...ergibt

Page 34: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

Valgrinderkennt

• IllegaleZugriffe:

‐ SpeicherwurdenichtiniOalisiert‐ ZugriffaußerhalbreserviertenSpeichers

• AllocaOon/DeallocaOonMismatches:

‐ mitnewalloziertundmitfree(anstaHdelete)freigegeben

‐ Feldmitdelete(anstaHdelete[])freigegeben

• MemoryLeaks–nichtfreigegebenerSpeicher

• DoubleFrees–doppeltfreigegebenerSpeicher

Fehlerarten

Page 35: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• IstvirtuelleMachinemitJIT

• ÜbersetztBinärcodedesProgrammsinpla�orm‐unabhängigenByte‐Code

• Diesersog.UcodewirdvonValgrind‐Toolsmodifiziert• Danachrückübersetztundausgeführt

• DadurchlassensichbeliebigeProgrammeanalysieren• LaufzeitistaberumeinVielfachesgrößer

ValgrindDocumentaOon‐hHp://valgrind.org/docs/

FunkOonsweisevonvalgrind

Page 36: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

WEITERETOOLS

Page 37: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• DasVerwaltenundModifizierenvongroßenC++Paketenkannsehrkomplexsein

• GuteDokumentaOonwirddannsehrwichOg

• DokumenOertwerdenmüssen‐ FunkOonen,FunkOonsparameterundReturn‐Werte

‐ KlassenundMember‐Variablen

Doxygen

• IsteinWerkzeugzurDokumentaOonvonC++Quelltextenähnlichjavadoc• AnalysiertQuelltextkommentareimDoxygenformat

• Erzeugthtml‐,pdf‐,latex‐,…DateienmitderentsprechendenDokumentaOon

DokumenOeren...

Page 38: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

* Beispiel einer Dokumentation einer Funktion /** Dokumentation of a function * @paramlower lower bound of the range * @paramupper upperbound of the range * @return A vector with the same size as this * vector and binary elements * @warning some detail .. * @todo .. * @bug …

**/ FVector findInRange(float lower, float upper) const;

Doxygen‐hHp://www.stack.nl/~dimitri/doxygen/

Doxygen‐Beispiel‐hHp://api.kde.org/4.x‐api/kdevplayorm‐apidocs/

...mitDoxygen

Page 39: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

BeigroßenProjektentretenfolgendeProblemeauf:

• WiekoordiniertundsynchronisiertmanCodezwischenverschiedenenEntwicklern?

• WiesichertmanCodegegenversehentlichesLöschenoderarchiviertalteStände?

PerMail?Dateienonlineablegen?AufNetzlaufwerkenarbeiten?

Nein!

Lösung:SourceCodeManagementTool(SCM)bspw.:• Subversion

• CVS

• Trac

• Git

Zusammenarbeiten...

Page 40: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

SCMbestehtaus:

‐ Repository–CodegespeichertaufzentralemServer

‐ Workingcopy–Entwickler/‐incheckteineKopiedesRepositoriesaufseinen/ihrenComputeraus

‐ Revisionhistory–JedeÄnderungeinerDateiwirdaufdemServergespeichert,kannauchwiederrückgängiggemachtwerden

‐ ConflictHandling–WaspassiertwennzweiEntwicklerdieselbeDateiverändern?InderselbenZeile?

...miteinemSCM

Page 41: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

1. EntwicklerchecktRepositoryiniOalaus

2. ÄndertseinelokaleWorkingcopy

3. CommitedseineÄnderungenindasRepository4. UpdatedseineWorkingcopymitdenÄnderungenderanderern

Entwickler

5. Datei‐Differenzen(diffs)werdenzwischenRepositoryundWorkingcopieshin‐undhergeschickt

Differenzen(Patches)zweierDateienliefertdasTooldiff

diff –u Datei1 Datei2 > MeinBugFixAnwendenkannmandiesemitpatch

patch –p0 < MeinBugFix

Abläufe

Page 42: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

• KommandosfürKommunikaOonmitdemServer:- svn checkout <URL>- svn update- svn commit

• OfflineKommandos- svn add <Datei> - svn delete <Datei>- svn diff- svn rename- svn move- …- svn help <Kommando>

TorOoseSVN(WindowsClient)‐hHp://tortoisesvn.net/undTutorial

SVNHomepage‐hHp://subversion.Ogris.org/undTutorial

Subversion‐SVN

Page 43: Programmierwerkzeuge · 2012. 9. 3. · • Berechne Abhängigkeitsgraph • Für Zielkomponente A ‐ besmme Komponenten A 1A n von denen A abhängt ‐ rufe Algorithmus für alle

ENDE