当我想在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
的完整定义非常糟糕。
如何解决这个问题?
答案 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)
它实际上显示了定义的行,所以我们不需要来回检查。