Nix-komentoja: G

Komentoja

Nix-komentoja: G

[gcc] - tai: [g++] - nimi: GNU Compiler Collection (aikaisemmin lyhenne tarkoitti: GNU C Compiler) - nimi: G++ (kun halutaan korostaa, että kyseessä nimenomaan C++ compiler) - versio: 3.2.3 (3/2005) (proffan lehtorilla) - webbisivu: http://gcc.gnu.org/ (3/2005) - tarkoitus: kääntäjä kielille C, C++, Objective-C, Fortran, Java, Ada KÄYTTÖ LYHYEHKÖSTI - käännä ja aja ohjelma ohjelm, jonka lähdekoodi koostuu vain yhdestä lähdekooditiedostosta: - gcc ohjelm.cc - ./ohjelm - käännä ohjelma ohjelm, jonka lähdekoodi koostuu useasta lähdekooditiedostosta: - gcc -o peli kali.cc moottori.cc - luo ohjelma ohjelm, jonka lähdekoodi koostuu useasta lähdekooditiedostosta, siten että lähdekooditiedostot 1) käännetään ensin objektitiedostoiksi, sitten 2) linkitä objektitiedostoista ohjelma (tällöin jos suurissa ohjelmissa vain yhtä lähdekooditiedostoa muutetaan, tarvitsee tehdä vain yksi objektitiedosto, jolloin säästyy aikaa kääntämisen suhteen, ja tällöin Makefilen avulla kääntämistä voi nopeuttaa, kun ei aina tarvitse kirjoittaa montaa kääntämisriviä ja lopuksi pitkää linkitysriviä saadakseen ohjelman käännettyä ja linkattua): - gcc -c kali.cc - gcc -c moottori.cc - gcc -o ohjelm kali.o moottori.o KOMENTORIVIPARAMETREJA Kääntäminen - -c: luo objektitiedosto, mutta älä linkkaa - gcc -c ohjelm.cc - -o: määrittele luotavan output-tiedoston nimi - esim. määrittele objektitiedoston nimeksi ohjelm.o: - gcc -o ohjelm.o ohjelm.cc - esim. määrittele ohjelmatiedoston (binääritiedoston) nimeksi ohjelm: - gcc -o ohjelm ohjelm.cc Virheilmoitukset ja varoitukset - -pedantic: anna varoituksia tiukan ISO C tai ISO C++ -standardien mukaisesti - -Werror-implicit-function-declaration: anna varoitus (tai virhe), jos jotakin funktiota käytetään ennen kuin se on esitelty - -Wparentheses: anna varoitus, jos sulkeet on jätetty pois tilanteessa, jossa voisi olla järkevää käyttää niitä (esim. sijoitus ja totuusarvot) - -Wunused-parameter: varoita, kun jotakin funktion parametria ei ole käytetty (paitsi sen esittelyssä tietysti) - -Wunused-variable: varoita, kun jotakin muuttujaa ei ole käytetty (paitsi sen esittelyssä tietysti) - -Wall: kaikki yllä olevat W[jotain]-optiot yhdistettynä (tässä dokumentissa kaikkia W[jotain]-optioita ei ole listattuna) - -W: anna lisävaroituksia Debuggaus - -g: normaali debuggaus - -ggdb: anna debuggaustietoja mahdollisimman laajalla tavalla, jotta tiedoista on mahdollisimman paljon hyötyä gdb-debuggerille Optimointi - -O0: älä optimoi - -O1: optimoi: yritä vähentää koodin kokoa ja suoritusaikaa - -O2: optimoi enemmän: käytä lähes kaikkia optimointimenetelmiä (paitsi loop unrolling, function inlining, register renaming) - -O3: optimoi vieläkin enemmän - -Os: optimoi yrittäen pienentää koodin kokoa Vain C++-koodille sopivia argumentteja - -Wctor-dtor-privacy: varoita, jos luokka vaikuttaa hyödyttömältä (esim. kaikki rakentajat ja purkajat ovat private-puolella) - -Wnon-virtual-dtor: varoita, jos luokan purkaja on ei-virtuaalinen (esim. jos vaikuttaa siltä, että luokkaa käytetään kantaluokkana periyttämisessä) Ilmoitusten muotoilu - -fmessage-length=n: yritä muotoilla ilmoitukset leveydeksi n merkkiä (oletusasetus on 72 merkkiä) Kohdekone - -b <kone>: käännä koneelle <kone> [gdb] - nimi: GNU Project debugger - tarkoitus: debuggeri - debuggereista yleensä: "The principal purposes of using a debugger are so that you can stop your program before it terminates; or so that, if your program runs into trouble, you can investigate and find out why." KÄYTTÖ LYHYESTI - 1. käynnistä debuggeri: gdb ohjelman-nimi - 2. käynnistä ohjelma (debuggerin sisällä): run - 3. lopeta debuggeri: quit KÄÄNTÄJÄN OPTIOT - jotta debuggaaminen olisi helpompaa, anna kääntäjälle laajan debuggaustiedon optio -ggdb (tai optiot -gdwarf-2 ja -g3 eli "-gdwarf-2": anna debuggaustietoja Dwarf 2 -muodossa ja "-g3": anna debuggauksen lisätietoja) (tai normaalin debuggaustiedon optio -g), jotta kääntäjä lisää debuggaus-tietoa käännettävään ohjelmaan KOMENTORIVIPARAMETREJA - anna debuggauskomennot tiedostosta (optio -x): - gdb -x testi_debuggaus_debug_commands.txt testi_debuggaus - esimerkkituloste (jokainen funktio on asetettu tiedostossa pysäytyskohdaksi ja ohjelmaa jatketaan uudelleen ja uudelleen komennolla continue): ->--------------------------------------------------------------------------->- [Thread debugging using libthread_db enabled] [New Thread -1218523008 (LWP 25964)] *********************************************** main() [Switching to Thread -1218523008 (LWP 25964)] Breakpoint 1, debuggausEiAlaTasta () at testi_debuggaus.cc:50 50 { debuggausEiAlaTasta() Breakpoint 2, debuggausAlkaa () at testi_debuggaus.cc:56 56 { debuggausAlkaa() Breakpoint 3, eiPalautaArvoaEiArgumenttiaEiPaikallistaMuuttujaa () at testi_debuggaus.cc:62 62 { eiPalautaArvoaEiArgumenttiaEiPaikallistaMuuttujaa() Breakpoint 4, annaLukuOtaLuku (luku=1) at _ostream.h:300 300 __os._M_put_nowiden(__s); annaLukuOtaLuku() Breakpoint 5, annaMjonoOta2Mjonoa (argumentti1= {<_STL::_Nondebug_string<char,_STL::char_traits<char>,_STL::allocator<char> >> = {<_STL::_String_base<char,_STL::allocator<char> >> = {_M_start = 0x9aa3b70 "ekaMjono", _M_finish = 0x9aa3b78 "", _M_end_of_storage = {<_STL::allocator<char>> = {<No data fields>}, _M_data = 0x9aa3b79 "\b\t\n\v\f\r\016\220;ª\t\023\024\025\026\027\030\031\032\033\034\035\036 ;ª\t#$%&'()*+,-.°;ª\t3456789:;<=>À;ª\tCDEFGHIJKLMNÐ;ª\tSTUVWXYZ[\\]^à;ª\tcdefghijklmnð;ª\tstuvwxyz{|}~"}}, static npos = 4294967295}, _M_iter_list = {_M_node = {_M_owner = 0xbfffbe80, _M_next = 0x0}, _M_lock = {<_STL::_STLP_mutex_base> = {_M_lock = {__m_reserved = 0, __m_count = 0, __m_owner = 0x0, __m_kind = 0, __m_lock = {__status = 0, __spinlock = 0}}}, <No data fields>}}}, argumentti2=@0xbfffbe80) at testi_debuggaus.cc:81 81 { annaMjonoOta2Mjonoa() *********************************************** Program exited normally. -<---------------------------------------------------------------------------<- - avustus: luetteloi gdb:lle annettavia komentoriviparametreja (optioita): - gdb -help (tai: gdb -h) - anna debugattavalle ohjelmalle argumentteja (kaikki argumentin --args jälkeiset merkit tulkitaan debugattavalle ohjelmalle annetuiksi argumenteiksi): - gdb --args ohjelm --help - älä tulosta gdb:n alkutekstejä (-silent): - gdb -silent ohjelm (tai gdb -q) - tekstikäyttöliittymä (-tui): gdb -tui ohjelm (ei toimi lehtori-koneella) - tilastotietoja (-statistics): gdb -statistics ohjelm KOMENTOTULKKI Komentojen toistaminen ja täydentäminen - Return-näppäin toistaa viimeksi annetun komennon (ei toimi kaikkien komentojen kohdalla) - sarkain (tabulaattori) täydentää puuttuvat merkit komennosta - info bre<Tab> -> info breakpoints - jos painat sarkainta toisen kerran, näet kaikki mahdolliset vaihtoehdot - jos et halua sanantäydennystä, ympäröi komento heittomerkeillä ('), hyödyllinen esimerkiksi C++:n kanssa jos ohjelmassa jokin funktio on kuormitettu (samanniminen funktio erilaisilla argumenteilla) - b 'funkt(arg1, arg2)' Kommentointi - #-merkin jälkeiset merkit samalla rivillä ovat kommentteja: - # tama on kommentti Aja ohjelma - aja ohjelma: - run - esimerkkituloste (kaksi tähtiriviä ja niiden väliset funktioiden nimet ovat testiohjelman omia tulosteita): ->--------------------------------------------------------------------------->- (gdb) run Starting program: /u/students/avoin_ko/hasa/laaja/testi/testi_debuggaus [Thread debugging using libthread_db enabled] [New Thread -1218523008 (LWP 20590)] *********************************************** main() eiPalautaArvoaEiArgumenttiaEiPaikallistaMuuttujaa() annaLukuOtaLuku() annaMjonoOta2Mjonoa() *********************************************** Program exited normally. -<---------------------------------------------------------------------------<- - lopeta: - quit (tai Ctrl-d: syöte loppui) - tallenna ohjelman syötteet tiedostoon output - run > output - debuggaa jo käynnissä oleva ohjelma: - ps - attach prosessitunnus - poista prosessi - detach - kerro tietoja ohjelmasta, jota tällä hetkellä ajetaan - info program - esimerkkituloste testiohjelmasta, joka on pysäytetty pysäytyskohdan avulla: ->--------------------------------------------------------------------------->- (gdb) info program Using the running image of child Thread -1218547584 (LWP 21126). Program stopped at 0x80490b9. It stopped at breakpoint 1. -<---------------------------------------------------------------------------<- Pysäyttämiskohdat - aseta pysäytyskohta tiettyyn funktioon - break function - esimerkkituloste: ->--------------------------------------------------------------------------->- (gdb) break annaLukuOtaLuku Breakpoint 1 at 0x80490b9: file _ostream.h, line 300. -<---------------------------------------------------------------------------<- - aseta pysäytyskohta (esim. funktio, rivinumero, osoite, pinon instruction) - break tiedosto:funktio - break rivinumero - break tiedosto:rivinumero - break *osoite - aseta pysäytyskohta n riviä ennen tai jälkeen kohdan, jossa ohjelma lakkaa toimimasta - break +offset - break -offset - aseta pysäytyskohdaksi tietty tila (ohjelma pysähtyy, jos cond = true) - break...if tila - aseta pysäytyskohdaksi funktiot, joiden nimessä on merkkijono mjono - rbreak mjono - näytä tiedot pysäytyskohdista: - info break - esimerkkituloste (pysäytyskohtana yksi funktio): ->--------------------------------------------------------------------------->- (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x080490b9 in annaLukuOtaLuku(int) at _ostream.h:300 -<---------------------------------------------------------------------------<- - älä käytä pysäytyskohtaa: - disable 1 - tällöin "info break" antaa (eli Enb = n): ->--------------------------------------------------------------------------->- (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep n 0x080490b9 in annaLukuOtaLuku(int) at _ostream.h:300 -<---------------------------------------------------------------------------<- - käytä (jälleen) pysäytyskohtaa: - enable 1 - tällöin "info break" antaa (eli Enb = y) jälleen: ->--------------------------------------------------------------------------->- (gdb) info break Num Type Disp Enb Address What 1 breakpoint keep y 0x080490b9 in annaLukuOtaLuku(int) at _ostream.h:300 -<---------------------------------------------------------------------------<- - kun ohjelmaa ajetaan, tulostuu tällaista: ->--------------------------------------------------------------------------->- (gdb) run Starting program: /u/students/avoin_ko/hasa/laaja/testi/testi_debuggaus [Thread debugging using libthread_db enabled] [New Thread -1218539392 (LWP 20370)] *********************************************** main() eiPalautaArvoaEiArgumenttiaEiPaikallistaMuuttujaa() [Switching to Thread -1218539392 (LWP 20370)] Breakpoint 1, annaLukuOtaLuku (luku=1) at _ostream.h:300 300 __os._M_put_nowiden(__s); -<---------------------------------------------------------------------------<- - jatketaan ohjelman ajoa komennolla continue: ->--------------------------------------------------------------------------->- (gdb) continue Continuing. annaLukuOtaLuku() annaMjonoOta2Mjonoa() *********************************************** Program exited normally. -<---------------------------------------------------------------------------<- - poista pysäytyskohta: - clear funktio - clear tiedosto:funktio - clear rivinumero - poista kaikki pysäytyskohdat: - clear Tarkkailukohdat - aseta tarkkailukohdaksi muuttuja mjono - watch mjono Sieppauskohdat - aseta sieppauskohdaksi poikkeuksen heitto, poikkeuksen sieppaaminen - catch throw - catch catch Funktio funktiolta eteneminen (continuinti) - aseta jokainen funktio pysäytyskohdaksi, sitten anna komento run, ja sitten anna uudelleen ja uudelleen komento continue (tai siis paina vain rivinvaihtoa uudelleen ja uudelleen) Kohta kohdalta eteneminen (steppaus, nextaus) - mene eteenpäin ohjelmaa yksi kohta (lähdekoodirivi tai komentokäsky) kerrallaan (käytännössä pääsee näkemään hyvin paljon sotkua, tarkoitan koodia) - jatka ohjelmaa seuraavaan kohtaan asti: - step - next - jatka ohjelmaa n kohdan verran; - step 100 - next 100 - jatka ohjelmaa pysäytyskohtaan asti - until pysäytyskohta - esimerkki komennon until käytöstä: 1) määritetään neljäksi pysäytyskohtaksi ohjelman neljä ekaa funktiota, 2) ajetaan komennolla run ekaan pysäytyskohtaan asti, 3) ajetaan komennolla "until 4" kohtaan 4 (siis neljänteen funktioon asti): - break debuggausEiAlaTasta - break debuggausAlkaa - break eiPalautaArvoaEiArgumenttiaEiPaikallistaMuuttujaa - break annaLukuOtaLuku - run - until 4 ->--------------------------------------------------------------------------->- (gdb) break debuggausEiAlaTasta Breakpoint 1 at 0x80490e0: file testi_debuggaus.cc, line 50. (gdb) break debuggausAlkaa Breakpoint 2 at 0x80490b0: file testi_debuggaus.cc, line 56. (gdb) break eiPalautaArvoaEiArgumenttiaEiPaikallistaMuuttujaa Breakpoint 3 at 0x8049080: file testi_debuggaus.cc, line 62. (gdb) run Starting program: /u/students/avoin_ko/hasa/laaja/testi/testi_debuggaus [Thread debugging using libthread_db enabled] [New Thread -1218531200 (LWP 24421)] *********************************************** main() [Switching to Thread -1218531200 (LWP 24421)] Breakpoint 1, debuggausEiAlaTasta () at testi_debuggaus.cc:50 50 { (gdb) until 3 debuggausEiAlaTasta() main () at testi_debuggaus.cc:104 -<---------------------------------------------------------------------------<- Kehykset - näytä tietoa kehyksistä: - info frame - esimerkkituloste funktiosta, jolla ei ole paluuarvoa, argumentteja eikä paikallisia muuttujia: ->--------------------------------------------------------------------------->- (gdb) info frame Stack level 0, frame at 0xbfffabf0: eip = 0x80490b0 in debuggausAlkaa() (testi_debuggaus.cc:56); saved eip 0x8049b63 called by frame at 0xbfffad60 source language c++. Arglist at 0xbfffabe8, args: Locals at 0xbfffabe8, Previous frame's sp is 0xbfffabf0 Saved registers: eip at 0xbfffabec -<---------------------------------------------------------------------------<- - esimerkkituloste funktiosta, jolla on int-paluuarvo, int-argumentti ja paikallinen int- ja string-muuttuja: ->--------------------------------------------------------------------------->- (gdb) info frame Stack level 0, frame at 0xbfffabf0: eip = 0x8049119 in annaLukuOtaLuku(int) (_ostream.h:300); saved eip 0x8049b74 called by frame at 0xbfffad60 source language c++. Arglist at 0xbfffabe8, args: luku=1 Locals at 0xbfffabe8, Previous frame's sp is 0xbfffabf0 Saved registers: ebx at 0xbfffabdc, ebp at 0xbfffabe8, eip at 0xbfffabec -<---------------------------------------------------------------------------<- - esimerkkituloste funktiosta, jolla on string-paluuarvo, kaksi string-argumenttia (toinen vakioviite) ja kolme paikallista string-muuttujaa: ->--------------------------------------------------------------------------->- (gdb) info frame Stack level 0, frame at 0xbfffe230: eip = 0x804920c in annaMjonoOta2Mjonoa(_STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >, _STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> > const&) (_ostream.h:300); saved eip 0x8049b7f called by frame at 0xbfffe3a0 source language c++. Arglist at 0xbfffe228, args: argumentti1= {<_STL::_Nondebug_string<char,_STL::char_traits<char>,_STL::allocator<char> >> = {<_STL::_String_base<char,_STL::allocator<char> >> = {_M_start = 0x4c6b60 "¬'L", _M_finish = 0x9e25828 "\210 L", _M_end_of_storage = {<_STL::allocator<char>> = {<No data fields>}, _M_data = 0x9e25720 "\210 L"}}, static npos = 4294967295}, _M_iter_list = {_M_node = {_M_owner = 0x9e25618, _M_next = 0x9e25510}, _M_lock = {<_STL::_STLP_mutex_base> = {_M_lock = {__m_reserved = 5009344, __m_count = 5009184, __m_owner = 0x4c6e80, __m_kind = 5008864, __m_lock = {__status = 5008704, __spinlock = 5008544}}}, <No data fields>}}}, argumentti2=@0xbfffe2a0 Locals at 0xbfffe228, Previous frame's sp is 0xbfffe230 Saved registers: ebx at 0xbfffe21c, ebp at 0xbfffe228, esi at 0xbfffe220, edi at 0xbfffe224, eip at 0xbfffe22c -<---------------------------------------------------------------------------<- - tiedot funktion argumenteista (kaksi string-argumenttia: eka normaali, toka viite): ->--------------------------------------------------------------------------->- (gdb) info args argumentti1 = {<_STL::_Nondebug_string<char,_STL::char_traits<char>,_STL::allocator<char> >> = {<_STL::_String_base<char,_STL::allocator<char> >> = {_M_start = 0x4c6b60 "¬'L", _M_finish = 0x9e25828 "\210 L", _M_end_of_storage = {<_STL::allocator<char>> = {<No data fields>}, _M_data = 0x9e25720 "\210 L"}}, static npos = 4294967295}, _M_iter_list = {_M_node = {_M_owner = 0x9e25618, _M_next = 0x9e25510}, _M_lock = {<_STL::_STLP_mutex_base> = {_M_lock = {__m_reserved = 5009344, __m_count = 5009184, __m_owner = 0x4c6e80, __m_kind = 5008864, __m_lock = {__status = 5008704, __spinlock = 5008544}}}, <No data fields>}}} argumentti2 = ( const string &) @0xbfffe2a0: {<_STL::_Nondebug_string<char,_STL::char_traits<char>,_STL::allocator<char> >> = {<_STL::_String_base<char,_STL::allocator<char> >> = {_M_start = 0x4c6b60 "¬'L", _M_finish = 0x9e25828 "\210 L", _M_end_of_storage = {<_STL::allocator<char>> = {<No data fields>}, _M_data = 0x9e25720 "\210 L"}}, static npos = 4294967295}, _M_iter_list = {_M_node = {_M_owner = 0x9e25618, _M_next = 0x9e25510}, _M_lock = {<_STL::_STLP_mutex_base> = {_M_lock = { __m_reserved = 5009344, __m_count = 5009184, __m_owner = 0x4c6e80, __m_kind = 5008864, __m_lock = {__status = 5008704, __spinlock = 5008544}}}, <No data fields>}}} -<---------------------------------------------------------------------------<- - tiedot funktion paikallisista muuttujista: - info locals - esimerkkituloste (kolme string-muuttujaa: paikallinenMjono2, paikallinenMjono3, paikallinenMjono4): ->--------------------------------------------------------------------------->- (gdb) info locals paikallinenMjono2 = {<_STL::_Nondebug_string<char,_STL::char_traits<char>,_STL::allocator<char> >> = {<_STL::_String_base<char,_STL::allocator<char> >> = {_M_start = 0x9b0ca0 "\204*­û", _M_finish = 0x804ac4c "", _M_end_of_storage = {<_STL::allocator<char>> = {<No data fields>}, _M_data = 0xbfffe228 "\230ãÿ¿\177\233\004\b âÿ¿pâÿ¿"}}, static npos = 4294967295}, _M_iter_list = {_M_node = {_M_owner = 0x9e24b58, _M_next = 0x9e24a78}, _M_lock = {<_STL::_STLP_mutex_base> = {_M_lock = {__m_reserved = 165825150, __m_count = 165825151, __m_owner = 0x0, __m_kind = 0, __m_lock = {__status = 0, __spinlock = 0}}}, <No data fields>}}} paikallinenMjono3 = {<_STL::_Nondebug_string<char,_STL::char_traits<char>,_STL::allocator<char> >> = {<_STL::_String_base<char,_STL::allocator<char> >> = {_M_start = 0x9e25018 "È0L", _M_finish = 0xa <Address 0xa out of bounds>, _M_end_of_storage = {<_STL::allocator<char>> = {<No data fields>}, _M_data = 0xbfffe1f8 "\177Jâ\t"}}, static npos = 4294967295}, _M_iter_list = {_M_node = {_M_owner = 0x2, _M_next = 0xbfffe1f0}, _M_lock = {<_STL::_STLP_mutex_base> = {_M_lock = { __m_reserved = -1073749168, __m_count = -1073749464, __m_owner = 0x9e24b50, __m_kind = -1073749392, __m_lock = {__status = 8, __spinlock = 8}}}, <No data fields>}}} paikallinenMjono4 = {<_STL::_Nondebug_string<char,_STL::char_traits<char>,_STL::allocator<char> >> = {<_STL::_String_base<char,_STL::allocator<char> >> = {_M_start = 0x4c6b60 "¬'L", _M_finish = 0x9e25828 "\210 L", _M_end_of_storage = {<_STL::allocator<char>> = {<No data fields>}, _M_data = 0x9e25720 "\210 L"}}, static npos = 4294967295}, _M_iter_list = {_M_node = {_M_owner = 0x9e25618, _M_next = 0x9e25510}, _M_lock = {<_STL::_STLP_mutex_base> = {_M_lock = {__m_reserved = 5009344, __m_count = 5009184, __m_owner = 0x4c6e80, __m_kind = 5008864, __m_lock = {__status = 5008704, __spinlock = 5008544}}}, <No data fields>}}} -<---------------------------------------------------------------------------<- - vaihda tutkittavaa kehystä (args = kehyksen osoite tai gdb:n luoma pinokehysnumero): - frame args Useamman säikeen ohjelmat - ohjelmasta voi olla enemmän kuin yksi säie - luettele säikeet: - info threads - tee tietystä säikeestä nykyinen säie: - thread luku Useamman prosessin ohjelmat - gdb:llä ei varsinaisesti ole tapaa debugata useamman prosessin ohjelmaa, mutta voit kokeilla käyttää sleep-komentoa kun lapsi-prosessi on syntynyt, sitten ps-komennolla ota selville lapsen prosessinumero Avustus - help: anna ohje jostakin komennosta: - help (tai h) - nähdään komentokategoria (command class) status, ja halutaan tutustua siihen: - help status - nähdään komento (command) info, ja halutaan tutustua siihen: - help info - nähdään alikomento (subcommand) args, ja halutaan tutustua siihen: - help info args - apropos: etsi ohje sanahaulla: - apropos reload - complete: etsi komennot, joilla sama alku kuin annetuilla kirjaimilla: - complete i - info: - info registers Logitiedosto - tallenna gdb:n tulosteet logitiedostoon: - set logging on Termistöä - breakpoint (pysäyttämiskohta): ohjelma pysäytetään tietyssä kohtaa ohjelmaa (esim. kun saavutaan johonkin funktioon) - watchpoint (tarkkailukohta): ohjelma pysäytetään, kun jokin arvo muuttuu - catchpoint (sieppauskohta): ohjelma pysäytetään, kun jokin tapahtuma tapahtuu (esim. kun C++:ssa heitetään poikkeus) - stack frame (pinokehys) tai frame (kehys): sellainen osa muistia, jossa on tietoa siitä, mitä funktiota kutsuttiin millä argumenttiarvoilla, mitä paikallisia arvoja funktio sisälsi ja mikä funktion osoite on (siis lyhyesti sanoen kehys sisältää yhden funktiokutsun tiedot), gdb valitsee yhden pinokehyksen (yleensä viimeksi käsitellyn), johon komennot kohdistuvat, mutta voit valita myös muita kehyksiä, kun ohjelma käynnistyy on olemassa vain yksi kehys ja se kehys on mainin kehys eli alkukehys eli uloin kehys, aina kun funktio antaa paluuarvon, kyseisen funktion kehys poistetaan, viimeisintä kehystä kutsutaan sisimmäksi kehykseksi, kehyksen muistikohta tallennetaan kehysosoitinrekisteriin - call stack (kutsupino): sisältää pinokehyksiä Lähdekoodin tutkiminen - luetteloi 10 riviä lähdekoodia: - list - list rivinumero - esimerkkituloste: ->--------------------------------------------------------------------------->- (gdb) list 1 1 /* 2 * Copyright (c) 1999 3 * Silicon Graphics Computer Systems, Inc. 4 * 5 * Copyright (c) 1999 6 * Boris Fomitchev 7 * 8 * This material is provided "as is", with absolutely no warranty expressed 9 * or implied. Any use is at your own risk. 10 * -<---------------------------------------------------------------------------<- - listaa lähdekooditiedostot (myös käytetyt kirjastot): - info sources - esimerkkitulosteen alku: ->--------------------------------------------------------------------------->- (gdb) info sources Source files for which symbols have been read in: testi_debuggaus.cc, _ios.c, _string.c, _alloc.h, _string.h, _iterator_base.h, _algobase.h, _uninitialized.h, _new.h, char_traits.h, _numpunct.h, _debug.h, _threads.h, _ostream.h, _ios.h, _streambuf.h, _ios_base.h, _ostream.c, _stdio_file.h, tutnew.h, iostream -<---------------------------------------------------------------------------<- - listaa funktiot - list functions - esimerkkitulosteen alku (näyttää eri funktioiden joukossa myös itse koodatut funktiot annaLukuOtaLuku(), annaMjonoOta2Mjonoa, debuggausAlkaa(), debuggausEiAlaTasta(), eiPalautaArvoaEiArgumenttiaEiPaikallistaMuuttujaa(), main()): ->--------------------------------------------------------------------------->- (gdb) info functions All defined functions: File testi_debuggaus.cc: void _Nondebug_string(_STL::_Nondebug_string<char,_STL::char_traits<char>,_STL::allocator<char> > * const, const char *, const _STL::allocator<char> &); void _Nondebug_string(_STL::_Nondebug_string<char,_STL::char_traits<char>,_STL::allocator<char> > * const, const _STL::_Nondebug_string<char,_STL::char_traits<char>,_STL::allocator<char> > &); void _STL::_String_base<char, _STL::allocator<char> >::_M_allocate_block(unsigned int); void _STL::_String_base<char, _STL::allocator<char> >::_M_throw_length_error() const; void _STL::basic_ios<char, _STL::char_traits<char> >::_M_handle_exception(int); class _STL::basic_ostream<char,_STL::char_traits<char> > &_STL::basic_ostream<char, _STL::char_traits<char> >& _STL::endl<char, _STL::char_traits<char> >(_STL::basic_ostream<char, _STL::char_traits<char> >&); void _STL::basic_ostream<char, _STL::char_traits<char> >::_M_put_nowiden(char const*); _STL::basic_ostream<char,_STL::char_traits<char> > &_STL::basic_ostream<char, _STL::char_traits<char> >::put(char); int annaLukuOtaLuku(int); string annaMjonoOta2Mjonoa(_STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >, _STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> > const&); bool bool _STL::_M_init<char, _STL::char_traits<char> >(_STL::basic_ostream<char, _STL::char_traits<char> >&); void debuggausAlkaa(); void debuggausEiAlaTasta(); void eiPalautaArvoaEiArgumenttiaEiPaikallistaMuuttujaa(); int main(void); void ~basic_string(_STL::basic_string<char,_STL::char_traits<char>,_STL::allocator<char> > * const); static void __static_initialization_and_destruction_0(int, int); static void global constructors keyed to _Z19debuggausEiAlaTastav(void); static void global destructors keyed to _Z19debuggausEiAlaTastav(void); -<---------------------------------------------------------------------------<- Datan tutkiminen - näytä jokin arvo aina, kun ohjelma pysähtyy: - display arvo Seuraamiskohdat - HUOM! voi käyttää vain remote targeteiden kanssa, esimerkiksi: - käännetään tulkattava versio (syntyy tiedosto a.out): - tutg++ -ggdb testi_debuggaus.cc - debugataan tulkittavaa versiota: - gdb a.out - seuraa joidenkin kohtien arvoja pysäyttämättä ohjelmaa - trace funktio // funktion ensimmäinen lähdekoodirivi - trace *funktio // funktion tarkka alkamisosoite - trace rivi // rivinumero - poista seuraamiskohta: - delete seuraamiskohta - seuraamiskohta pois käytöstä: - disable seuraamiskohta - seuraamiskohta (jälleen) käyttöön: - enable seuraamiskohta - lopeta seuraamiskohdan x seuraaminen y toiston jälkeen: - passcount y x - näytä tilastotiedot: - tstatus Kokoonpanokohtaisia tietoja - joillekin kokoonpanoille on poikkeuksia: esim. HP-UX, SVR4, DJGPP, M68k, PowerPC, Alpha, MIPS Miten GDB käyttäytyy - aseta korkeus ja leveys: - set height luku - set width luku Tekstikäyttöliittymä - asetetaan tekstikäyttöliittymä päälle: - gdb -tui (tai komento gdbtui) Signaaleja - SIGSEGV: Signal: Segmentation Violation (SegmentationFault): virheellinen osoitus muistiin (esim. osoitin osoittaa nollaan) Käyttöopas-dokumentti - luin käyttöoppaan 9. versiota (Ninth Edition), joka on tarkoitettu GDB:n versiolle 6.3 - luettu "tarkasti" dokumentista tulostettavan version sivun vasemman yläkulman sivunumeron mukaan sivut 1-33 tai Adobe Acrobat Professionalin ikkunan alareunan keskiosassa näyttämän sivunumeron mukaan sivut 1-45 (lukuun "5 Stopping and Continuing" asti), vähemmän tarkasti sivut 34-64 (46-76) [gencat] - tarkoitus: Creates and modifies a message catalog [Gnus] - tarkoitus: Gnus is a flexible message reader running under GNU Emacs - tarkoitus: mail reader and a news reader - käynnistä vain Gnus: emacs -f gnus - kommentti: ei ole gnus-komentoa, mutta tällä hakusanalla löytyy esimerkiksi internetistä tietoa: - sivuja: http://www.gnus.org/ , http://my.gnus.org/ - uutisryhmä: gnu.emacs.gnus [grep] - tarkoitus: merkkijonon hakeminen tiedostosta tai syötteestä (1) JOHDANTO - huom. proffalla on pidempi ohje grepille kuin Lintulassa (29.8.2003) - optioita: -c: tulosta vain rivien määrä, joista löytyi haettu asia -i: älä ota huomioon isojen ja pienien kirjaimien eroa haussa -n: näytä rivinumero ennen riviä, josta löytyi haettu asia -l: tulosta vain tiedostojen nimet rivien kera -s: älä näytä virheilmoituksia ei-olemassaolevista tiedostoista tai tiedostoista, joita ei pysty lukemaan -v: tulosta kaikki rivit, paitsi ne joilta haettu asiaa löytyy -w: etsi kuin merkkijono olisi sana -e: määrittele yksi tai useampi merkkijono -E: etsi käyttäen kokonaisia merkkijonoja -f: lue merkkijonot yhdestä tai useammasta tiedostosta -F: etsi käyttäen vakiomerkkijonoja, vakiomerkkijonossa yhtäkään merkkiä ei käsitellä erikoismerkkinä vaan sellaisena kuin se on (ks. <<man fgrep>>) -q: "hiljainen tila", älä näytä näytöllä tuloksia Termistöä - regular expression / string / pattern: (haettava) "merkkijono" - match / substring / sequence: "osuma", "täsmäävyys", löytynyt merkkijono, joka vastaa haettavaa merkkijonoa - character: "merkki" - collating element: "yhdistetty elementti", joissakin kielissä kaksi kirjainta ovat "yhdistetty elementti" (esim. ch tai lh), esimerkiksi espanjan kielessä aakkosjärjestys on muodossa {a, b, c, ch, d,...,k, l, ll, m, ...} - multicharacter collating element: "yhdistetty elementti", joka koostuu useasta merkistä - null pattern (''): "tyhjä merkki", grep näyttää hakutuloksena kaikki rivit, myös tyhjät rivit - case-sensitive: erottaa pienet ja isot kirjaimet toisistaan - case-insensitive: pitää isoja ja pieniä kirjaimia samanarvoisina - ordinary characters: "tavanomaiset merkit", ne merkit, jotka eivät ole erikoismerkkejä - special characters: "erikoismerkit": esim. . * [ \ (period, asterisk, left bracket and backslash) (piste, tähti, vasen hakasulku, kenoviiva) - brackets: "hakasulkeet": [] - bracket expression: "hakasulkumerkkijono", merkkijono hakasulkeiden sisällä - bracket expression search: "hakasulkumerkkijonohaku": näyttää kaikki ne rivit, joissa on merkkijono, jossa esiintyy yksikin hakasulkeiden sisällä oleva merkki, esim. hakasulkumerkkijonon [123] avulla voi etsiä rivejä, joilla esiintyy jokin numeroista 1, 2 tai 3 - matching list expression: "täsmäävyyslistamerkkijono", hae merkkiä, joka täsmää täsmäävyysmerkkijonon merkkiä, esim. vastaavuusmerkkijonolla [a3] haet merkkejä a tai 3 - nonmatching list expression: "ei-täsmäävyyslistamerkkijono", hae kaikki muut merkit paitsi sirkumfleksin (potenssimerkin) perässä olevat merkit, esim. ei-täsmäävyysmerkkijonolla [^abc] haet kaikki muut merkit paitsi merkit a, b ja c, sirkumfleksin pitää olla heti vasemman hakasulkumerkin perässä tai se menettää erikoismerkityksensä - collating symbol: (aakkos-) "järjestetty symboli" on merkkijono hakapistesulkeiden ([..]) sisällä, esim. haulla <<grep -i '[[.Ch.]]' tiedosto>> etsit merkkejä <<ch, Ch, cH, or CH>>, eli nyt et ei etsitä joko merkkiä c tai h, vaan etsitään järjestettyä symbolia Ch (ei järjestyksessä hC), kyseessä on kieliin liittyvä symboli, esimerkiksi espanjan kielessä yksi järjestetyistä symboleista on Ch, esim. merkkijonolla [a-[.ch.]] haetaan merkkejä a, b, c tai ch - equivalence class expression: "vastaavuusluokkamerkkijono" määrittelee joukon "järjestettyjä elementtejä", esim. e, é ja è (jos et näe kirjaimia oikein, koska et jostakin syystä pysty näkemään ISO-8859-1 -merkistöä oikein, niin kerrottakoon, että ne kirjaimet ovat e, e aksenttimerkillä ja e sillä toisella aksenttimerkillä) kuuluvat samaan vastaavuusluokkaan ja tällöin esim. hakasulkumerkkijonot [[=e=]a], [[=é=]a], and [[=è=]a] vastaavat hakasulkumerkkijonoa [eéèa] - character class expression: "kirjainluokkamerkkijono", täsmää minkä tahansa merkin, joka kuuluu haluttuun kirjainluokkamerkkijonoon (esim. pienet tai suuret kirjaimet), joka on määritelty ympäristömuuttujassa LC_CTYPE, luokkia ovat esimerkiksi <<alpha, upper, lower, digit, alnum, xdigit, space, print, punct, graph ja cntrl>>, esim. kirjainluokkamerkkijonolla [[:lower:]] etsitään mitä tahansa yksittäistä pientä kirjainta - range expression: (luku- tai merkki-) "aluemerkkijono", aluemerkkijonossa on ensin merkki sitten väliviiva (hyphen) ja lopuksi toinen merkki, esim. voit etsiä aluemerkkijonolla [a-d] kirjaimia a, b, c tai d, väliviiva menettää erikoismerkityksensä jos se on ensimmäisenä tai viimeisenä aluemerkkijonossa, esim. kummallakin hakumerkkijonoista [-df] and [df-] etsitään merkkejä d, f tai -, koska väliviiva on menettänyt erikoismerkityksensä, esim. aluemerkkijonolla [&--] löytää merkit, jotka ovat merkkien & ja - välillä - subexpression: "alimerkkijono", merkkijono sulkukenoviivojen (\ ja \) välissä, alimerkkijonoja voi olla yhdeksän ja muistaa jokaisen alimerkkijonon järjestyksen, esim. haussa \(a\)\(b\)c\2\1 siis 1. alimerkkijono on a, 2. alimerkkijono on b, sitten "tavallinen" c, sitten viittaus 2. alimerkkijonoon, lopuksi viittaus 1. alimerkkijonoon, eli haetaan merkkijonoa "abcba"; alimerkkijonoja voi olla enintään yhdeksän - back-reference expression: "takaisinviittausmerkintä": esimerkiksi edellä olevassa esimerkissä "\2" ja "\1" ovat takaisinviittauksia - interval expression: "esiintymiskertamerkintä": merkkijonon, alimerkkijonon tai takaisinviittausmerkinnän perässä oleva esiintymiskertamerkintä ilmaisee, montako kertaa sen edellä oleva asia saa esiintyä; \{i\}: tasan i esiintymiskertaa, \{i,\}: vähintään i esiintymiskertaa, \{i,j\}: vähintään i mutta enintään j esiintymiskertaa Lyhenteitä - RE: Regular expression - BRE: basic regular expression - ERE: extended regular expression Teoriaa - grepille "todellinen osuma" on vasemmanpuoleisin riviltä löytyvä osuma - grepille "todellinen osuma" on pisin riviltä löytyvä osuma, esimerkiksi esimerkkitiedostossamme testi.txt haulle 'a.*b' "todellinen osuma" kuudennella (sisältö abab) rivillä ei ole "ab" vaan "abab" - jos haluaa etsiä erikoismerkkiä, pitää erikoismerkin eteen laittaa kenoviiva, - esim. etsi rivit, joissa on piste: - grep "\." testi.txt - esim. etsi rivit, joissa lukee .cc - grep "\.cc" testi.txt (2) YKSITTÄISESTÄ TIEDOSTOSTA ETSIMINEN Esimerkkejä - esim. näytä esimerkkitiedostomme testi.txt ne rivit, joissa on merkki 'b' grep 'b' testi.txt ab abc abcd a123bcd a---bcd a bcd ababababababab acbcbc b b456 -> grep näyttää rivit, joilla yksi tai useampi b-kirjain, b-kirjaimen ei tarvitse olla ensimmäinen merkki rivillä - esim. näytä esimerkkitiedostomme testi.txt ne rivit, joissa on merkkijono, joka alkaa a-kirjaimella ja päättyy b-kirjaimeen grep 'a.*b' testi.txt ab abc abcd a123bcd a---bcd a bcd ababababababab acbcbc -> kirjainten a ja b välissä voi kirjainten lisäksi olla numeroita ja joitakin muita merkkejä kuten sanaväli ja väliviiva -> grep ei näytä rivejä 11 ("a") ja 12 ("b"), koska vaikka ne muodostavatkin jossain mielessä merkkijonon "ab", niin grep ei näytä niitä, koska grep näyttää vain samalla rivillä olevat osumat - esim. näytä esimerkkitiedostomme testi.txt ne rivit (merkkijonot), joissa on mikä tahansa merkki grep '' testi.txt 12356 ab abc abcd a123bcd a---bcd a bcd ababababababab acbcbc a b b456 c789 B456 -> tavallaan joka rivillä on tyhjä joukko '', koska tyhjä joukko mahtuu mille tahansa riville koska se on "ei-mitään" ja "ei-mitään" mahtuu minne vain koska se ei vie tilaa koska sillä ei ole ulottuvuuksia kuten leveys ja pituus - esim. näytä esimerkkitiedostomme testi.txt ne rivit, joissa on merkki a, b tai 1 grep '[ab1]' testi.txt 12356 ab abc abcd a123bcd a---bcd a bcd ababababababab acbcbc a b b456 - esim. näytä esimerkkitiedostomme testi.txt ne rivit, joissa on merkkijono, joka alkaa merkillä a tai 3 ja päättyy merkkiin c tai 5 grep '[a3][c5]' testi.txt 12356 acbcbc -> grep löysi merkkijonot "35" ja "ac", mutta olisi voinut löytää myös merkkijonot "3c" ja "a5", jos ne olisivat olleet grepattavassa tiedostossa - esim. näytä esimerkkitiedostomme testi.txt ne rivit, joissa on merkkijono, jossa on ensin jokin pieni kirjain ja sitten numero 1 grep -i '[[:lower:]][1]' testi.txt a123bcd - esim. näytä esimerkkitiedostomme testi.txt ne rivit, joissa on merkkijono, jossa on ensin jokin pieni kirjain ja sitten jokin numero grep -i '[[:lower:]][[:digit:]]' testi.txt a123bcd b456 c789 B456 -> hakutulosta "B456" ei pitäisi tulla - esim. näytä esimerkkitiedostomme testi.txt ne rivit, joissa on merkkijono, jossa on ensin numero 1, sitten jokin kirjaimista a, b, c tai d, ja lopuksi numero 2 grep '1[a-d]2' testi.txt 1a2 - esim. näytä esimerkkitiedostomme testi.txt ne rivit, jotka alkavat ASCII-kirjaimella: grep '^[a-zA-Z]' testi.txt ab abc abcd a123bcd a---bcd a bcd ababababababab acbcbc a b b456 c789 B456 - esim. näytä esimerkkitiedostomme testi.txt ne rivit, joissa sana "abc" esiintyy 3-5 kertaa: egrep '^(abc ?){3,5}$' testi.txt abc abc abc abc abc abc abc - esim. näytä esimerkkitiedostomme elukat.txt ne rivit, joissa on jokin halutuista sanoista, tässä tapauksessa kissa tai koira: grep -E "(kissa|koira)" elukat.txt kissa koira (3) ETSI TIEDOSTOJEN JOUKOSTA - esim. näytä nykyisen hakemiston niiden tiedostojen rivit, joissa lukee Tomi grep "Tomi" * - esim. näytä kaikkien hakemiston omat/muut tiedostojen rivit, joissa lukee emacs grep "emacs" $HOME/omat/muut/* - esim. listaa ne .plan-tiedostot, joissa lukee merkkijono "katu", mutta älä näytä virheilmoituksia (mene ensin hakemistoon /home) grep -l -s 'katu' avoin_ko/*/.plan - esim. listaa ne .plan-tiedostot, joissa lukee merkkijono "katu" ja lisäksi näytä ne rivit, joissa se merkkijono "katu" lukee (mene ensin hakemistoon /home) grep -s 'katu' avoin_ko/*/.plan - esim. C-lähdekoodissa voit tarkistaa, onko alkavia ja päättyviä sulkumerkkejä yhtä paljon seuraavilla hauilla (hauista on hyötyä olettaen, että yhdenlaista sulkumerkkiä esiintyy vain kerran rivillä): grep -F -c '{' lahdekoodi.c grep -F -c '}' lahdekoodi.c - esim. näytä, mitä tiedoston rivillä 780 lukee: cat -n testi.txt | grep 780 (4) ETSI TIETOVIRRASTA - esim. näytä kaikki käyttäjät, joiden nimi on Tomi finger tomi | grep "Tomi" - esim. näytä käyttäjän Matti Meikäläinen tunnus finger matti | grep "Meikäläinen" - näytä what-käskyn tulosteesta vain kolme riviä: ensimmäinen (load average), toinen (User) ja haluttu käyttäjä: w | grep -E "(load|login@|kayttaja)" 16:40 up 80 days, 14:29, 172 users, load average: 1.19, 0.56, 0.50 User tty from login@ idle JCPU PCPU what kayttaja r3 koneennimi.cc.tu 15:38 2:35 9 grep(...) (5) MAINITUT ESIMERKKITIEDOSTOT Esimerkkitiedostoja - alla on esimerkkitiedostojen sisällöt, jotta saa varmasti oikean käsityksen yllä olevista esimerkeistä - huom. testi.txt-tiedoston ensimmäisellä rivillä lukee 12356, ei 123456 kuten voi hätäisesti lukiessaan luulla, luku ei ole oma ideani, vaan otin sen mukaan grepin man-sivulta - huom. testi.txt-tiedoston kolmas rivi on tyhjä rivi, sillä ei ole sanaväliä ---testi.txt---------------------------------------- 12356 ab abc abcd a123bcd a---bcd a bcd ababababababab acbcbc a b b456 c789 B456 1a2 1e2 abc abc abc abc abc abc abc ---------------------------------------------------- ---elukat.txt--------------------------------------- aasi kissa koira leijona ---------------------------------------------------- - esim. erota tietokannasta tietokanta.txt miehet ja naiset: ---tietokanta.txt----------------------------------- Mary clerk F James clerk M Frank clerk M John clerk M Jessica clerk F ---------------------------------------------------- Tapa 1 (grepillä): grep 'M$' tietokanta.txt James clerk M Frank clerk M John clerk M * * * grep 'F$' tietokanta.txt Mary clerk F Jessica clerk F -> dollari ($) tarkoittaa rivinloppua eli grep etsii kirjainta, jonka jälkeen on heti rivinpäättymismerkki Tapa 2 (awk:lla): awk '$3=="M"' filename > male awk '$3=="F"' filename > female [groups] - tarkoitus: näytä, mihin käyttäjäryhmiin ihminen kuuluu - esim. groups mattimeikalainen [gzip] - tarkoitus: pakkaa tai purkaa tiedoston korvaten vanhan tiedoston uudella - käskyjä: gzip, gunzip, zcat - tiedostopääte: .gz - esim. pakkaa tiedosto testi.txt parhaalla mahdollisella pakkaussuhteella - gzip -9 testi.txt - esim. näytä gzip-tiedostojen pakkaussuhteet - gzip -l *.gz

Muutettu viimeksi: 29. marraskuuta 2013

Tekijä: Tomi Häsä (tomi.hasa@gmail.com)

URL: http://sites.google.com/site/tomihasa/nix-komentoja-g