FastNetMon

Показаны сообщения с ярлыком cscope. Показать все сообщения
Показаны сообщения с ярлыком cscope. Показать все сообщения

понедельник, 17 мая 2010 г.

Навигация по коду крупных проектов: cscope + vim

В прошлой статье мы настроили cscope, теперь пришел черед интегрировать его в vim: http://phpsuxx.blogspot.com/2010/05/debian-cscope.html

Теперь добиваемся глубокой интеграции с vim.

Для начала нужно указать пути к БД символов:
CSCOPE_DB=/usr/src/php5-5.2.6.dfsg.1/cscope.out; export CSCOPE_DB


Теперь просто запускаем vim и выполняем:
:cscope help


либо в краткой форме:
:cs help


Теперь пробуем обратится к БД cscope:
:cs find g _zend_class_entry


Если получаем облом:
E567: no cscope connections


То делаем следующее:
:cs add /usr/src/php5-5.2.6.dfsg.1/cscope.out


Но есть способ проще:

Добавляем следующее в ~/.vimrc

if has("cscope")
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
endif


И все, теперь файл будет подхватываться на автомате или браться из переменной среды!

Основано на: http://cscope.sourceforge.net/cscope_vim_tutorial.html и http://vimdoc.sourceforge.net/htmldoc/if_cscop.html

Навигация по коду крупных проектов: Debian + cscope

Итак, имеем крупный проект, в моем примере это PHP, так как я активно мучаю его внутренности:

apt-get install -y dpkg-dev
cd /usr/src
apt-get sources php5-cgi
cd php5-5.2.6.dfsg.1


В этом проекте крайне мало файлов:
# find | grep .c | wc -l
4352
# find | grep .h | wc -l
6858


И навигация по ним крайне проста! Ага, поверили? :)

Итак, как возможно ориентироваться в куче этих файлов? Разумеется, найти нужную функцию по имени / комментариям можно посредством:
grep -HiR 'func_name' *


Но если Вы ищите тело функции, то Вы получите в лучшем случае пару-тройку экранов с вызовами этой функции и одну строку с прототипом и реализацией. Весьма захватывающее зрелище, не правда ли? Ну а если Вам требуется найти объявление какой-либо структуры, а не использование ее в качестве типа? Так уже почти не решаемая задача, совпадений будут тысячи, если не десятки тысяч.

На помощь нам приходит утилита cscope: cscope - Interactively examine a C program source


Ставим:
apt-get install -y cscope


Теперь запускаем индексацию нашего дерева кодов:
cd php5-5.2.6.dfsg.1
# -b означает только создание индекса, без запуска оболочки
# -q ускоренный индекс
# -k "режим ядра с игнором /usr/include", полезен при работе с libc, kernel
# -R рекурсивный просмотр вложенных директорий
cscope -b -q -R


В итоге мы получим ряд файлов в папке с кодом:

ls -al | grep csc
-rw-r--r-- 1 root root 106496 May 17 12:57 cscope.in.out
-rw-r--r-- 1 root root 138386 May 17 12:57 cscope.out
-rw-r--r-- 1 root root 188928 May 17 12:57 cscope.po.out


Где: scope.in.out, cscope.po.out - файлы с инвертированным индексом, cscope.out - собственно файл с базой данных кода.

Теперь, когда база сгенерирована можно запустить интерактивную оболочку для поиска кода:

# -d только запуск оболочки, без переиндексации
cscope -d


Теперь для примера осуществим поиск тела функции zend_alter_ini_entry:
Find this global definition: zend_alter_ini_entry


Как видите, программа сходу выдает тело функции без кучи промежуточных поисков.

Далее, давайте попробуем поискать тип данных _zend_class_entry:
Find this global definition: _zend_class_entry


И тут тоже сто процентный успех! Не правда ли, потрясающе?

Выход из оболочки по CTRL+d. Переключение между списком найденных файллв и меню, TAB.

Основано на: http://cscope.sourceforge.net/large_projects.html