Verder Terug Inhoud

5. Vi bondgenoten

In het algemeen wordt Vim in samenwerking met andere krachtige tools zoals ctags en gdb gebruikt. De ctags is voor zeer snelle navigatie door miljoenen regels "C/C++" code en gdb voor het debuggen van de "C/C++" code. Een beknopte introductie van deze twee onmisbare opdrachten zal in dit hoofdstuk worden gegeven.

De ctags is de krachtigste beschikbare opdracht voor het coderen in C, C++, Java, Perl, Korn/Bourne shell scripts of Fortran. Ontwikkelaars gebruiken ctags zeer uitgebreid om "naar en vanuit" duizende functies C/C++ programma's te navigeren. Zie onder Unix 'man ctags'. Het is zeer belangrijk dat je MOET leren hoe deze ctags te gebruiken om programma's in C of C++, Java, enz.. te ontwikkelen. Navigatie is de belangrijkste taak tijdens het ontwikkelen in C of C++ code. Met behulp van ctags kun je de code zeer snel lezen door te springen van de aanroepende regel naar de functie en dieper in geneste functie-aanroepen gaan en naar het begin teruggaan. Je kunt zeer snel heen en weer van functie naar functie gaan.

Zonder NAVIGATIE zal je waarschijnlijk verloren zijn! ctags is als de magnetische KOMPAS naald voor de programmeurs.

Gebruik van ctags :


        ctags *.cpp
        gvim -t foo_function
        gvim -t main

Hiermee zal het C++ programmabestand met daarin de functie foo_funtion() worden gewijzigd en zal de cursor automatisch op de eerste regel van de funtie foo_funtion() worden geplaatst. De tweede opdracht brengt je naar de regel met de main() functie definitie.

Binnen de Vim editor, kun je naar een functie springen door het intikken van een : (dubbele punt) tag < functie naam > als hieronder -


        :tag voorbeeld_functie

Hiermee zal de cursor op de eerste regel van voorbeeld_functie() worden geplaatst.

Als je binnen de functie naar een regel met de naam van de functie wilt springen, plaats je de cursor direct voor de naam van de functie en druk je op CTRL+] (druk tegelijkertijd op de control-toets en linker blokhaak), hierdoor zal je automatisch direct rechts van de regel terechtkomen waar de functie begint!!


                // voorbeeldcode
                switch(id_number) {
                        Case 1:
                                if ( foo_function( 22, "abcef") == 3 )
                                    ^
                                    |
                                    |
                                    |
                  Plaats de cursor hier (direct voor foo_function) en druk op CTRL+]
                  Hierdoor zal je naar de functie met de naam "foo_function" gaan. 
                  Druk op CTRL+t om naar deze regel terug te keren.

Druk op CTRL+t (Control-toets en letter 't' samen) om terug te gaan naar de aanroepende regel. Je blijft de CTRL+t indrukken om terug te gaan en naar de eerste regel te gaan vanwaar je de navigatie begon. Dat wil zeggen dat je de CTRL+] in kan blijven drukken en dan de CTRL+t om terug te gaan. Je kunt dit zovaak herhalen als je wilt voor volledige navigatie door de C of C++ functies.

5.1 Ctags voor ESQL

Aangezien ctags de Embedded SQL/C (ESQL) taal niet direct ondersteunt, kan het volgende script worden gebruikt om tags voor esql aan te maken. ESQL/C zijn database SQL opdrachten embedded binnen de "C" programma's. Oracle's ESQL/C wordt Pro*C genoemd en Sybase, Informix heeft ESQL/C en PostgreSQL heeft het produkt "ecpg".

Bewaar dit bestand als "sqltags.sh" en pas een a+rx tags_gen.sh toe.


#!/bin/sh

# Programma om ctags voor ESQL, C++ en C bestanden aan te maken
ESQL_EXTN=pc
tag_file1=tags_file.1
tag_file2=tags_file.2

which_tag=ctags

rm -f $tag_file1 $tag_file2 tags

aa=`ls *.$ESQL_EXTN`
#echo $aa
for ii in $aa 
do
        #echo $ii
        jj=`echo $ii | cut -d'.' -f1`
        #echo $jj

        if [ ! -f $jj.cpp ]; then
                echo " "
                echo " "
                echo "***********************************************"
                echo "ESQL *.cpp bestanden bestaan niet.. "
                echo "Je moet de *.cpp vanuit het *.pc bestand genereren"
                echo "met behulp van de Oracle Pro*C pre-compiler of Sybase"
                echo "of Informix esql/c pre-compiler."
                echo "En vervolgens deze opdracht weer opnieuw uitvoeren"
                echo "***********************************************"
                echo " "
                exit
        fi

        rm -f tags
        $which_tag $jj.cpp
        kk=s/$jj\.cpp/$jj\.pc/g

        #echo $kk > sed.tmp
        #sed -f sed.tmp tags >> $tag_file1

        #sed -e's/sample\.cpp/sample\.pc/g' tags >> $tag_file1
        sed -e $kk tags >> $tag_file1
done

# Handel nu alle C++/C bestanden af - sluit de ESQL *.cpp bestanden uit
rm -f tags $tag_file2
bb=`ls *.cpp *.c`
aa=`ls *.$ESQL_EXTN`
for mm in $bb 
do
        ee=`echo $mm | cut -d'.' -f1`
        file_type="NOT_ESQL"
        # Sluit de ESQL *.cpp en *.c bestanden uit
        for nn in $aa 
        do
                dd=`echo $nn | cut -d'.' -f1`
                if [ "$dd" = "$ee" ]; then
                        file_type="ESQL"
                        break
                fi
        done

        if [ "$file_type" = "ESQL" ]; then
                continue
        fi

        rm -f tags
        $which_tag $mm
        cat tags >> $tag_file2
done

mv -f $tag_file2 tags
cat  $tag_file1 >> tags
rm -f $tag_file1

# Moet tags bestand sorteren wil het juist werken ....
sort tags > $tag_file1
mv $tag_file1 tags

5.2 Ctags voor Javascript programma's, Korn, Bourne shells

Het hieronder gegeven shell-script kan worden gebruikt om tags voor een zeer grote variëteit aan programma's geschreven in variety of programs written in JavasScript, PHP/FI scripts, Korn shell, C shell, Bourne shell en vele anderen te genereren. Dit is een zeer algemene module.

Bewaar dit bestand als tags_gen.sh en pas een chmod a+rx tags_gen.sh toe.


#!/bin/sh

tmp_tag=tags_file
tmp_tag2=tags_file2

echo " "
echo " "
echo " "
echo " "
echo " "
echo "Genereer tags voor ...."
while :
do
        echo "    Voer de bestandsextensie in waarvoor je tags wilt genereren."
        echo -n "  Bestandsextensie zou iets moeten zijn als sh, js, ksh, enz... : "
        read ans

        if [ "$ans" == "" ]; then
                echo " "
                echo "Onjuiste invoer. Probeer opnieuw!"
        else
                break
        fi
done

\rm -f $tmp_tag

aa=`ls *.$ans`

for ii in $aa
do
        jj=`echo $ii | cut -d'.' -f1`
        #echo $jj
        cp $ii $jj.c
        ctags $jj.c
        echo "s/$jj.c/$ii/g" > $tmp_tag2
        sed -f $tmp_tag2 tags >> $tmp_tag
        \rm -f tags $jj.c
done

sort $tmp_tag > tags

\rm -f $tmp_tag $tmp_tag2

5.3 Debugger gdb

Je zou samen met Vi uitgebreid gebruik moeten maken van gdb. Debuggen is het belangrijkste aspect van programmeren aangezien de belangrijkste kosten van een softwareproject in het debuggen en testen gaan zitten.

Gebruik de too 'gdb' voor het debuggen van C++/C programma's. Zie 'man gdb'. Je moet je programma's met de optie -g3 compileren als

        gcc -g3 foo.c foo_another.c sample.c

Voor het eenvoudig instellen van aliassen -

  Stel een alias in in je ~/.bash_profile
        alias gdb='gdb -directory=/home/src -directory=/usr/myname/src '
  Give -
        gdb foo.cpp
        gdb> dir /hom2/another_src
        Dit zal aan het bestandszoekpad worden toegevoegd
        gdb> break 'some_class::func<TAB><TAB>
  Hiermee zal de functienaam worden aangevuld om je tijd te sparen bij het typen... en zal uitvoer produceren als -
        gdb> break 'some_class::function_foo_some_where(int aa, float bb)'

Het tweemaal indrukken van de TAB-toets is de voltooiïng van de opdrachtregel, wat je heel veel tijd zal besparen bij het typen. Dit is één van de belangrijkste technieken bij het gebruik van gdb.

Voor online hulp -

        gdb> help
  Geeft online hulp
        gdb> help breakpoints
  Geeft meer details over breakpoints.

Het instellen van breakpoints en het debuggen

        unixprompt> gdb exe_filename 
        gdb> b main
Hiermee zal een breakpoint in de main() functie worden geplaatst
        gdb> b 123
Hiermee zal een breakpoint in regel 123 van het huidige bestand worden geplaatst.
        gdb> help breakpoints
Geeft meer details over breakpoints.

Voor het analyseren van de core dumps

        unixprompt> gdb exe_filename  core
        gdb> bt
  Geeft backtrace van functies en regelnummers waar het programma in gebreke bleef
        gdb> help backtrace
  Geeft meer details over backtrace.

Je kunt ook de GUI-versie van gdb, genaamd xxgdb gebruiken.

Memory leak tools -


Verder Terug Inhoud