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.