FastNetMon

Monday, 17 May 2010

Навигация по коду крупных проектов: 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

No comments :

Post a Comment

Note: only a member of this blog may post a comment.