如何在lxr.free-electronics.com网站上找到结构的完整定义?
当我想在linux内核中找到结构的定义时,这个站点非常有用 然而,令人恼火的是: 如果在许多其他头文件中声明了一个结构,那么找到的结果将是大量不完整的声明和一个完整的结构定义。很难区分定义和声明 例如,如何在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行
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*{'
。