Как найти полное определение структуры на сайте lxr.free-electrons.com?

Сайт http://lxr.free-electrons.com/ очень полезен, когда я хочу найти определение структуры в ядре Linux.

Однако, что раздражает:

Если структура объявлена ​​во многих других заголовочных файлах, то найденными результатами будет множество неполных объявлений и одно полное определение структуры. Трудно различить определение и декларации.

Например, результаты поиска struct task_struct являются:

task_struct

Определяется как тип структуры в:

drivers / mmc / card / queue.h, строка 7 drivers/oprofile/cpu_buffer.h, строка 21

драйверы / сеть / беспроводная связь /cw1200/cw1200.h, линия 34

include / uapi / linux /ability.h, строка 18

include / asm-generic / syscall.h, строка 22

......

......

Это очень ужасно, чтобы найти полное определение struct task_struct,

Как решить эту проблему?

3 ответа

Кажется, это ограничение LXR, движка lxr.free-electrons.com: он не дифференцирует предварительные объявления (struct task_struct;) из полных определений.

Мой метод выбора всегда заключается в рассмотрении имен файлов, поскольку обычно очевидно, где должно быть заданное определение структуры (например, в вашем случае это связано с планированием, поэтому sched.h в списке файлов должно быть это). Тем не менее, я понимаю, что кто-то может быть незнаком с исходным кодом ядра Linux, и поэтому не знаю, куда идти.

Лучший способ найти определение структуры в дереве исходных текстов Linux - это поиск буквально:

struct struct_name {

Поскольку авторы Linux придерживаются строгого стиля кодирования, определения структуры всегда должны принимать эту форму.

У LXR есть свободный поиск, чтобы справиться с его ограничениями. К сожалению, он использует Google Search, который игнорирует большинство знаков препинания. GitHub, кажется, игнорирует их, как и Google Code.

Мой совет - клонировать основной Git-репозиторий 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 и продолжить исследования.

Вот функция оболочки для перехода на соответствующую страницу 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 {'

Надеюсь, поможет.

Попробуйте это https://code-grep.com/view/project/54b083273b2082684a000008/linux-3.19-rc2?search=task_struct&type=definitions&page=0

это на самом деле показывает строку определения, поэтому нам не нужно идти туда-сюда, чтобы проверить.

Я считаю очень полезным загрузить исходный код linux в мою систему и просматривать с помощью cscope инструмент командной строки. Это вместе с ctags очень полезно для навигации по коду.

Другие вопросы по тегам