Как найти полное определение структуры на сайте 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
очень полезно для навигации по коду.