当我想在linux内核中找到结构的定义时,站点lxr.free-electrons.com非常有用。
但是,烦人的是什么:
如果在许多其他头文件中声明了一个结构,那么找到的结果将是很多不完整的声明和一个完整的结构定义。很难区分定义和声明。
例如,struct task_struct的搜索结果是:
task_struct 定义为结构类型: 驱动程序/mmc/card/Quee.h,第7行驱动程序/oprofile/cpu_Buffer.h,第21行 驱动程序/net/wireless/ 34 1200/cw1200.h,第34行 包括/uapi/linux/capability.h,第18行 包括/asm-泛型/syscall.h,第22行 . .
找到struct task_struct的完整定义是非常糟糕的。
如何解决这个问题?
发布于 2014-11-27 06:51:43
这似乎是lxr.free-Electrons.com背后的引擎LXR的一个限制:它没有区分前向声明(struct task_struct;)和完整的定义。
我选择的方法总是通过查看文件名来选择,因为通常很明显,给定的结构定义应该在哪里(例如,在您的例子中,它与调度有关,所以文件列表中的sched.h应该有它)。但是,我知道人们可能不熟悉Linux内核源代码,因此不知道该去哪里。
在Linux源代码树中找到结构定义的最佳方法是从字面上搜索:
struct struct_name {由于严格编码风格后面跟着Linux贡献者,所以结构定义应该始终采用这种形式。
LXR有一个自由图文检索来处理它的局限性。不幸的是,它使用谷歌搜索,其中的忽略大多数标点符号。GitHub似乎也忽略了它们,也忽略了Google。
我的建议是克隆主线Linux存储库:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git然后是grep (或者更好的是ag)在include目录中寻找的内容:
grep -rin 'struct task_struct {' include或者,使用ag
ag 'struct task_struct {' include您将在结果中看到定义此结构的文件(通常只有一个),然后可以在LXR上找到适当的文件并继续您的研究。
下面是一个shell函数,可以使用第一个结果转到适当的LXR页面:
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。像这样使用它:
lxr 'struct task_struct {'希望能帮上忙。
发布于 2014-11-27 06:50:09
我发现在我的系统中下载linux源代码并使用cscope命令行工具浏览非常有用。它与ctags一起对于代码导航非常有用。
发布于 2015-01-12 06:22:03
试试这个struct&type=definitions&page=0
它实际上是显示定义的行,所以我们不需要来回检查。
https://stackoverflow.com/questions/27162892
复制相似问题