如何在站点lxr.free-electrons.com上找到结构的完整定义?

时间:2014-11-27 04:05:46

标签: c linux linux-kernel lxr

当我想在linux内核中找到结构的定义时,网站lxr.free-electrons.com非常有用。

然而,恼人的是:

如果在许多其他头文件中声明了结构,那么找到的结果将是许多不完整的声明和结构的一个完整定义。很难区分定义和声明。

例如,struct task_struct的搜索结果为:

  

的task_struct

     

在:

中定义为结构类型      

drivers / mmc / card / queue.h,第7行驱动程序/ oprofile / cpu_buffer.h,第21行

     

drivers / net / wireless / cw1200 / cw1200.h,第34行

     

include / uapi / linux / capability.h,第18行

     

include / asm-generic / syscall.h,第22行

     

...

     

...

找到struct task_struct的完整定义非常糟糕。

如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

这似乎是LXR的限制,LXR是lxr.free-electrons.com背后的引擎:它没有将前向声明(struct task_struct;)与完全定义区分开来。

我的选择方法总是通过查看文件名,因为在给定的结构定义应该是通常很明显的地方(例如,在你的情况下,它与调度有关,所以{{1在文件列表中应该有它)。但是,我知道有人可能不熟悉Linux内核源代码,因此不知道该去哪里。

在Linux源代码树中查找结构定义的最佳方法是按字面搜索:

sched.h

由于strict coding style之后是Linux贡献者,因此结构定义应始终采用此形式。

LXR有freetext search来应对其局限性。不幸的是,它使用Google搜索ignores most punctuations。 GitHub似乎也忽略了它们,以及Google Code。

我的建议是克隆主线Linux Git存储库:

struct struct_name {

然后git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git (或更好,ag)您在grep目录中寻找的内容:

include

或使用grep -rin 'struct task_struct {' include

ag

您将在结果中看到定义此结构的文件(通常只有一个),然后您可以转到LXR上的相应文件并继续研究。

这是一个shell函数,使用第一个结果转到相应的LXR页面:

ag 'struct task_struct {' include

或使用lxr() { chromium "http://lxr.free-electrons.com/source/$(grep -rl "$1" include | head -1)" }

ag

lxr() { chromium "http://lxr.free-electrons.com/source/$(ag -l "$1" include | head -1)" } 替换为您最喜欢的浏览器命令。像这样使用它:

chromium

希望它有所帮助。

答案 1 :(得分:0)

我发现在我的系统中下载linux源代码并使用cscope命令行工具进行浏览非常有用。它与ctags一起对代码导航非常有用。

答案 2 :(得分:0)

试试这个 https://code-grep.com/view/project/54b083273b2082684a000008/linux-3.19-rc2?search=task_struct&type=definitions&page=0

它实际上显示了定义的行,所以我们不需要来回检查。