命令行查找第三方符号
稍微大点的项目都会引入第三方库,有时候需要查询某个符号在哪些库中存在。比如说,crash需要判断是哪个库的方法,或者不同库有时候引入同样的符号,但是可能版本不同(这种很坑,查半天都可能不知道问题在哪。由于链接顺序等其他原因,某个库引用的符号其实是另外一个库的符号,导致异常crash。)。
查看符号的方法有很多,一般都用nm.但是如果项目引入很多个库,一个一个查找又很繁琐,所以楼主写了个查找第三方库符号和列出某个库包含的所有方法。由于shell环境不同,不同shell环境下写法也有差异,楼主的是zsh,mac环境下.如果是其他shell。需要自己修改下。framepath需要改成自己的地址。
涉及到的知识点有:
1.通过alias getallframepos=getallframepos_fn 的方法使得可以在方法内使用$1,$2引用传进去的参数。
2.shell中方法其实是没有返回值的。一个方法想要引用另外一个方法的返回值,这里通过goole搜索到了一个方法,在子方法内用local _outvar=$1 ,引用外部参数,结尾调用eval $_outvar=\$_result 。父方法用
 local _allfiles=()
	getallframepos _allfiles 调用子方法,局部变量_allfiles就是子方法的_result的值。不清楚这个技巧有哪些shell支持,需要根据不同shell修改。
3.通过上面的方法,_result本来应该是一个数组,但是结果变成了一个字符串,需要通过read -rA _allfiles <<< "$_allfiles" 将字符串分割成数组,这个貌似bash下就不支持这个。bash下的类型很乱。有空再梳理吧。
4.对于framework,二进制文件一般是aa.framework/aa. 需要再做一次拼接。
alias getallframepos=getallframepos_fn
function getallframepos_fn(){
	local _outvar=$1
	local _result=()
	local framePath="yourpath"
	afiles=(`find $framePath -name "*.a"`)
	framefiles=(`find  $framePath -name "*.framework"`)
	_result+=$afiles
	for i in $framefiles; do
		IFS='./' read -rA framename <<< "$i"
		framebinary="$i""/$framename[-2]"
		_result+=$framebinary
	done
	eval $_outvar=\$_result
}
function frameworks(){
	local _allfiles=()
	getallframepos _allfiles
	read -rA _allfiles <<< "$_allfiles"
	printf '%s\n' "${_allfiles[@]}"
}
alias symbolsearch=symbolsearch_fn
function symbolsearch_fn(){
	local _allfiles=()
	getallframepos _allfiles
	read -rA _allfiles <<< "$_allfiles"
	for i in $_allfiles; do
		symbols=`nm -nm $i`
		result=$(grep $1 <<< $symbols)
		# if [ ${#result[@]} -eq 0 ]; then
		if [[ -z $result ]]; then
		
		else
			echo $i
			echo "found:$result"
		fi
	done
}
alias symbolist=symbolist_fn
function symbolist_fn(){
	local _allfiles=()
	getallframepos _allfiles
	read -rA _allfiles <<< "$_allfiles"
	for i in $_allfiles; do
		if [[ $i =~ .*$1.* ]]; then
			echo $i
			local symbols=` nm -nm  $i`
			echo $symbols
		fi
	done
}
 
                    
                 
                
            
         
 浙公网安备 33010602011771号
浙公网安备 33010602011771号