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

如何在lxr.free-electronics.com网站上找到结构的完整定义?,c,linux,linux-kernel,lxr,C,Linux,Linux Kernel,Lxr,当我想在linux内核中找到结构的定义时,这个站点非常有用 然而,令人恼火的是: 如果在许多其他头文件中声明了一个结构,那么找到的结果将是大量不完整的声明和一个完整的结构定义。很难区分定义和声明 例如,struct task\u struct的搜索结果如下: 任务结构 在中定义为结构类型: drivers/mmc/card/queue.h,第7行drivers/oprofile/cpu_buffer.h,第21行 drivers/net/wireless/cw1200/cw1200.h,第34行

当我想在linux内核中找到结构的定义时,这个站点非常有用

然而,令人恼火的是:

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

例如,
struct task\u struct
的搜索结果如下:

任务结构

在中定义为结构类型:

drivers/mmc/card/queue.h,第7行drivers/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\u struct
的完整定义非常糟糕


如何解决这个问题?

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

这似乎是LXR的一个局限性,LXR.free-electronics.com背后的引擎:它不区分转发声明(
struct task_struct;
)和完整定义

我的选择方法总是通过查看文件名,因为给定的结构定义应该在哪里通常是显而易见的(例如,在您的情况下,它与调度相关,因此文件列表中的
sched.h
应该有它)。然而,我知道人们可能不熟悉Linux内核源代码,因此不知道该去哪里

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

struct struct_name {
由于Linux贡献者后面跟着a,因此结构定义应始终采用这种形式

LXR有一个解决其局限性的方法。不幸的是,它使用谷歌搜索,而谷歌搜索。GitHub似乎也忽略了它们,以及谷歌代码

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

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
然后是
grep
(或者更好地说,)您在
include
目录中查找的内容:

grep -rin 'struct task_struct {' include
或者,使用
ag

ag 'struct task_struct {' include
lxr() {
    chromium "http://lxr.free-electrons.com/source/$(ag -l "$1" include | head -1)"
}
您将在结果中看到定义此结构的文件(通常只有一个),然后您可以转到LXR上的相应文件并继续您的研究

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

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

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

lxr 'struct task_struct {'
希望有帮助。

试试这个

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

我会使用git grep,比如
git grep'struct*task\u struct*{'