在大型源码中,查找函数名确实有点头疼,如在 kernel/uboot 中,同样的函数名可能在多个文件中定义.
本脚本实现只在已编译的文件中查找关键字(含有*.o)
本脚本包含git grep命令, 假设是在git仓库下使用.
脚本
编写grep.sh如下:
#!/bin/sh
#Verson:1.0
#Auther:Jojo
if [ ! $1 ]; then
echo "Usage:./grep.sh function_name"
exit
fi
keyword=$1
ret=`git grep $keyword | awk -F ":" '{print $1}' | awk -F "." '{print $1".o"}'`
ret=`ls $ret 2> /dev/null | uniq | awk -F "." '{print $1".*"}'`
git grep -n $keyword $ret
使用技巧
假如我要在uboot下查找board_init_f,使用vim+gtags
结果发现它在超过20个以上的文件中出现
1 168 ../arm926ejs/mxs/spl_boot.c <<board_init_f>>
inline void board_init_f(unsigned long bootflag)
2 279 am33xx/board.c <<board_init_f>>
void board_init_f(ulong dummy)
3 21 armada-xp/spl.c <<board_init_f>>
void board_init_f(ulong dummy)
4 286 exynos/spl_boot.c <<board_init_f>>
void board_init_f(unsigned long bootflag)
5 134 omap-common/hwinit-common.c <<board_init_f>>
void board_init_f(ulong dummy)
6 264 omap3/board.c <<board_init_f>>
void board_init_f(ulong dummy)
7 151 sunxi/board.c <<board_init_f>>
void board_init_f(ulong dummy)
8 16 zynq/spl.c <<board_init_f>>
void board_init_f(ulong dummy)
9 252 ../../lib/board.c <<board_init_f>>
void board_init_f(ulong bootflag)
10 33 ../../lib/spl.c <<board_init_f>>
void __weak board_init_f(ulong dummy)
11 78 ../../mach-at91/spl_at91.c <<board_init_f>>
void board_init_f(ulong dummy)
12 78 ../../mach-at91/spl_atmel.c <<board_init_f>>
void board_init_f(ulong dummy)
13 82 ../../../avr32/lib/board.c <<board_init_f>>
void board_init_f(ulong board_type)
14 172 ../../../nds32/lib/board.c <<board_init_f>>
void board_init_f(ulong bootflag)
15 28 ../../../powerpc/cpu/mpc5xxx/spl_boot.c <<board_init_f>>
void board_init_f(ulong bootflag)
16 23 ../../../powerpc/cpu/ppc4xx/spl_boot.c <<board_init_f>>
void board_init_f(ulong bootflag)
17 338 ../../../powerpc/lib/board.c <<board_init_f>>
void board_init_f(ulong bootflag)
18 149 ../../../sparc/lib/board.c <<board_init_f>>
void board_init_f(ulong bootflag)
19 236 ../../../../board/armadeus/apf27/apf27.c <<board_init_f>>
void board_init_f(ulong bootflag)
20 136 ../../../../board/bachmann/ot1200/ot1200_spl.c <<board_init_f>>
void board_init_f(ulong dummy)
-- More --
我们使用脚本,只在已经编译了的文件中查找:
./grep.sh "board_init_f("
arch/arm/cpu/armv7/lowlevel_init.S:54: * this init in the SPL board_init_f() function which is called
arch/arm/lib/crt0.S:20: * 1. Set up initial environment for calling board_init_f().
arch/arm/lib/crt0.S:27: * 2. Call board_init_f(). This function prepares the hardware for
arch/arm/lib/crt0.S:29: * be available yet, , board_init_f() must use the current GD to
arch/arm/lib/crt0.S:37: * ones allocated by board_init_f() in system RAM, but BSS and
arch/arm/lib/crt0.S:42: * board_init_f().
arch/arm/lib/crt0.S:47: * RAM. GD has retained values set by board_init_f(). Some CPUs
arch/arm/lib/crt0.S:61: * Set up initial C runtime environment and call board_init_f(0).
arch/arm/lib/crt0.S:86: bl board_init_f
common/board_f.c:780:/* Record the board_init_f() bootstage (after arch_cpu_init()) */
common/board_f.c:1011:void board_init_f(ulong boot_flags)
范围一下缩小到两个文件. 结果一目了然.