Рейтинг@Mail.ru
[Войти] [Зарегистрироваться]

Наши друзья и партнеры

UnixForum
Беспроводные выключатели nooLite

Lines Club

Ищем достойных соперников.




Книги по Linux (с отзывами читателей)

Библиотека сайта или "Мой Linux Documentation Project"

Next Previous Contents

5. Компаньоны Vi

Обычно Vim используется совместно с другими мощными инструментами такими как ctags и gdb. Ctags для быстрой навигации сквозь миллионы строк "C/C++" кода и gdb для отладки "C/C++" кода. Эта глава посвящена именно этим двум незаменимым инструментам.

Ctags - это самая мощная и нужная команда для написания программ на C, C++, Java, Perl, Korn/Bourne shell scripts или Fortran. Разработчики широко используют ctags для навигации в тысячах функций программ на C/C++. (Смотрите 'man ctags'). Очень важно, чтобы вы научились использовать ctags. Это позволит вам эффективно писать программы на C/C++,Java и т.д. Навигации в море кода - одна из самых важных задач во время разработки программ на C/C++. Использование ctags позволит вам решать эту задачу быстро и эффективно. Ctags - позволяет очень быстро читать код, просматривать функции, перескакивая от одной функции к другой.

Без такой навигации, вы скорее всего заблудитесь в коде ! Ctags - компас для программиста.

Использование ctags :


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

Эти команда откроет программу на C++, которая содержит функцию foo_function() и разместит курсор на первой строке функции foo_function(). Вторая команда, отправит вас на строку в которой определена функция main().

Внутри Vim вы можете перейти к функции введя : (двоеточие) tag < имя функции >как показано ниже:


        :tag sample_function

Эта команда разместит курсор на первой строке функции sample_function()

Если вы захотите перейти прямо к функции от строки в файле, которая содержит имя этой функции, поместите курсор перед именем функции и нажмите CTRL+], это отправит вас прямо на строку где начинается искомая функция.


                // example code
                switch(id_number) {
                        Case 1:
                                if ( foo_function( 22, "abcef") == 3 )
                                    ^
                                    |
                                    |
                                    |
                  Разместите курсор здесь (перед foo_function) и нажмите CTRL+]
                  Это отправит вас на начало "foo_function". Чтобы вернуться назад нажмите CTRL+t

Чтобы отправиться назад, на исходную строку, нажмите CTRL+t. Вы можете нажимать CTRL+t несколько раз чтобы вернуться в точку где вы начали навигацию. Таким образом можно "пройти" скозь все функции C/C++ кода.

5.1 Ctags для ESQL

Т.к. ctags не поддерживают языка Embedded SQL/C (ESQL), то ,для создания тэгов для этого языка, необходим приведенный ниже shell script. ESQL/C - это команды SQL, для управления базой данных,встроенные в C программу. Oracle ESQL/C называется Pro*C и Sybase;для Infomix есть ESQL/C;для PostgreSQL есть "ecpg".

Сохраните этот файл как "sqltags.sh" и выполните chmod a+rx tags_gen.sh.


#!/bin/sh

# Программа для создания ctags для ESQL, C++ и C файлов
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 не существуют.. "
                echo "Вы должны сгенерировать *.cpp из файла *.pc "
                echo "используя Oracle Pro*C пре-компилятор или Sybase"
                echo "либо Informix esql/c пре-компилятор."
                echo "А затем перезапустить эту программу"
                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

# Теперь обработаем все C++/C файлы, исключая ESQL *.cpp файлы
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"
        # Exclude the ESQL *.cpp and *.c files
        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

# Чтобы все работало правильно необходимо отсортировать файл с тэгами ....
sort tags > $tag_file1
mv $tag_file1 tags

5.2 Ctags для Javascript программ, оболочек Korn и Bourne

Этот shell скрипт может быть использован для генерации тэгов для очень большого количества программ написанных на JavaScript,PHP/FI скрипты,Korn shell,C shell,Bourne shell и многих других. Это очень "стандартный" модуль.

Сохраните этот файл как tags_gen.sh и выполните chmod a+rx tags_gen.sh.


#!/bin/sh

tmp_tag=tags_file
tmp_tag2=tags_file2

echo " "
echo " "
echo " "
echo " "
echo " "
echo "Генерируем тэги для ...."
while :
do
        echo "    Введите расширение файлов, для которых вы хотите сгенерировать тэги."
        echo -n "    Расширения файлов должны быть заданы как sh, js, ksh, etc... : "
        read ans

        if [ "$ans" == "" ]; then
                echo " "
                echo "Неверный ввод. Попробуйте еще раз!"
        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 Дебаггер gdb

Вы почти наверняка захотите использовать gdb (смотрите 'man gdb') вместе с Vim. Отладка - один из наиболее сложных и трудоемких процессов в программировании.

Чтобы использовать gdb, вы должны компилировать программу с опцией -g3. Например:

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

Чтобы легко настроить псевдонимы, сделайте следующее -

Настройте псевдоним в вашем:
~/.bash_profile
        alias gdb='gdb -directory=/home/src -directory=/usr/myname/src '
  Выполните -
        gdb foo.cpp
        gdb> dir /hom2/another_src
        Это добавит некоторые файлы к пути поиска
        gdb> break 'some_class::func<TAB><TAB>
  Это позволит дополнять имена функции -
        gdb> break 'some_class::function_foo_some_where(int aa, float bb)'

Двойное нажатие TAB приведет к автоматическому завершению командной строки, что сохранит вам массу времени.

Чтобы получить помощь во время работы -

        gdb> help
  Выдает  на экран помощь
        gdb> help breakpoints
  Выдает более детальную помощь о breakpoints.

Для установки breakpoints и входа в отладку

        unixprompt> gdb exe_filename 
        gdb> b main
  Это поместит breakpoint на функции main() 
        gdb> b 123
  Это поместит breakpoint на 123й строке текущего файла 

Чтобы проанализовать core используйте -

        unixprompt> gdb exe_filename  core
        gdb> bt
  Начинает трассировку тех строк программы где произошла ошибка
        gdb> help backtrace
  Выдает более детальную помощь о режиме backtrace.

Вы также можете использовать GUI версию gdb называемую xxgdb.

Инструменты для отслеживания "утечек" памяти -


Next Previous Contents


Эта статья еще не оценивалась
Вы сможете оценить статью и оставить комментарий, если войдете или зарегистрируетесь.
Только зарегистрированные пользователи могут оценивать и комментировать статьи.

Комментарии отсутствуют