Использование комбинации grep / find для поиска использования функции или структуры - PullRequest
3 голосов
/ 06 августа 2010

Мне интересно, как я могу эффективно найти использование функции / структуры в файлах, используя комбинацию find & grep.

Например, у меня есть исходный код для git на моей машине. Если вы посмотрите на commit.h, вы увидите, что структура commit определена как,

struct commit {
    struct object object;
    void *util;
    unsigned int indegree;
    unsigned long date;
    struct commit_list *parents;
    struct tree *tree;
    char *buffer;
};

Мне интересно узнать, откуда эта структура инициализируется и как они инициализируют буфер. Сначала я попробовал,

grep -rn "(struct commit)" .

Это дало мне файл с инициализацией этой структуры. Теперь мне нужно выяснить, где инициализируется переменная buffer, которая является членом этой структуры.

grep -rn "buffer" .

возвращает много результатов и трудно выяснить, где он используется.

Так что мне интересно, как вы эффективно узнаете об использовании символа? Я не говорю о том, что предоставляет IDE, а использует стандартные инструменты linux, такие как grep и find. Как вам удается взломать большую кодовую базу и понять, как она работает?

Ответы [ 6 ]

10 голосов
/ 06 августа 2010

Вы оценивали cscope или ctags для этой цели?

Они оба хорошо работают как с vim, так и с emacs. Основная возможность, которую они вам предоставляют, - поиск определений символа в вашем исходном коде, который может использоваться и определяться в разных файлах.

Я лично использую cscope http://cscope.sourceforge.net/cscope_vim_tutorial.html, и это прекрасно работает для меня, чтобы копаться в коде.

2 голосов
/ 06 августа 2010

Kscope - это cscope + ctags с графическим интерфейсом пользователя. Очень удобно, если вы не большой поклонник vi или emacs. Поскольку изначально он был ориентирован на навигацию по исходным текстам ядра, у него нет проблем с обработкой больших проектов.

2 голосов
/ 06 августа 2010

Поиск ссылок на член структуры легче, если у члена есть менее общее имя, чем у «буфера».Но ты знал это.

Используя только современную версию grep, вы можете найти ссылки на все элементы с именем «buffer», доступ к которым осуществляется через указатель в виде:

grep --recursive --include=\*.c "->buffer"

или доступ к элементу локального экземпляра как:

grep --recursive --include=\*.c "\.buffer"

Разумное включение --recursive в GNU grep делает обучение правильному использованию поиска по дереву исходного кода гораздо менее важным.(Кроме того, я думаю, что у меня есть правильное цитирование ... но остерегайтесь цитирования оболочки в примере, напечатанном на манжете.)

Я бы согласился с рекомендацией изучить такие инструменты, как ctags и какони интегрируются с вашим редактором по вашему выбору.И emacs, и vim намного мощнее, чем кажется на первый взгляд.

0 голосов
/ 06 августа 2010

Я думаю, что вам нужно это GNU GLOBAL , который покажет все применения классов и функций в перекрестных ссылках, например, посмотрите на анализ ядра Linux

0 голосов
/ 06 августа 2010

Кроме cscope и ctags, как упомянуто Кисалаем.

Вы можете использовать try id-utils . Могут быть плагины VIM для использования idutils из VIM. Он создает ID-файл из вашего исходного кода и очень быстро выполняет поиск.

0 голосов
/ 06 августа 2010

Вы всегда можете собрать git с включенным флагом отладки GCC (-g) и использовать GDB . Вы можете установить точку останова в функции инициализации и вернуться оттуда. Это должно дать вам лучшее представление о том, что происходит в стеке вызовов, без необходимости следовать куче объявлений функций и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...