0

サイトlxr.free-electrons.comは、Linux カーネルで構造体の定義を見つけたい場合に非常に役立ちます。

ただし、面倒なのは次のとおりです。

構造体が他の多くのヘッダー ファイルで宣言されている場合、見つかった結果は、多くの不完全な宣言と構造体の 1 つの完全な定義になります。定義と宣言を区別するのは難しいです。

たとえば、の検索結果は次のstruct task_structとおりです。

task_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_struct

この問題を解決するには?

4

3 に答える 3

2

これは、lxr.free-electrons.com の背後にあるエンジンである LXR の制限のようです: 前方宣言 ( struct task_struct;) と完全な定義を区別しません。

私の選択の方法は、常にファイル名を見ることです。これは、通常、特定の構造定義がどこにあるべきかが明らかであるためです(たとえば、あなたの場合、それはスケジューリングに関連しているためsched.h、ファイルリストにあるはずです)。ただし、Linux カーネルのソース コードに慣れていないため、どこに行けばよいか分からないという人もいるでしょう。

Linux ソース ツリーで構造定義を見つける最善の方法は、文字どおりに検索することです。

struct struct_name {

Linux の貢献者は厳密なコーディング スタイルに従っているため、構造体の定義は常にこの形式を取る必要があります。

LXR には、その制限に対処するためのフリーテキスト検索があります。残念ながら、ほとんどの句読点を無視する Google 検索を使用しています。GitHub も、Google Code と同様にそれらを無視しているようです。

私のアドバイスは、メインラインの Linux Git リポジトリのクローンを作成することです。

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

この構造を定義するファイル (通常は 1 つだけ) が結果に表示されるので、LXR の適切なファイルに移動して調査を続けることができます。

最初の結果を使用して適切な 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-27T06:51:43.670 に答える
0

これを試して ください https://code-grep.com/view/project/54b083273b2082684a000008/linux-3.19-rc2?search=task_struct&type=definitions&page=0

実際には定義の行が表示されているので、確認するために行ったり来たりする必要はありません。

于 2015-01-12T06:22:03.993 に答える