使用grep / find组合来查找函数或结构的用法

时间:2010-08-06 05:09:52

标签: c linux grep

我想知道如何使用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工具,如grepfind。你如何设法入侵大代码库并了解它是如何工作的?

6 个答案:

答案 0 :(得分:10)

您是否为此目的评估了cscope或ctags?

它们都适用于vim和emacs。它们为您提供的主要功能是查找源代码中可能在不同文件中使用和定义的符号定义。

我个人使用cscope http://cscope.sourceforge.net/cscope_vim_tutorial.html,它可以很好地帮我挖掘代码。

答案 1 :(得分:2)

如果成员的名称不是“缓冲区”,那么查找对结构成员的引用会更容易。但你知道的。

只使用现代版本的grep,您可以找到对通过指针访问的名为“buffer”的所有成员的引用:

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

或作为本地实例的成员访问:

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

在GNU grep中合理包含--recursive使得学习正确地使用查找源代码树更不重要。 (另外,我认为我的引用是正确的......但要注意在袖口上打字的例子中引用shell。)

我同意建议学习像ctags这样的工具,以及它们如何与你选择的编辑器集成。 emacs和vim都比第一眼看上去强大得多。

答案 2 :(得分:2)

Kscope是带有图形用户界面的cscope + ctags。如果你不是vi或emacs的忠实粉丝,那将非常方便。由于它最初的目标是内核源代码导航,因此处理大型项目没有问题。

答案 3 :(得分:0)

您始终可以在启用GCC调试标志(-g)的情况下构建git并使用GDB。您可以在初始化函数中设置断点并从那里进行回溯。这应该让你更好地了解callstack中发生的事情,而不必遵循一堆函数声明等。

答案 4 :(得分:0)

除了Kisalay提到的cscope和ctags。

您可以使用try id-utils。可能有VIM插件使用来自VIM的idutils。 它会从您的源代码中创建一个ID文件,并且搜索速度非常快。

答案 5 :(得分:0)

我认为你需要的是GNU GLOBAL,它将以交叉引用的方式显示类和函数的所有用法,例如查看linux kernel的分析