首页 > 代码库 > 命令行查找第三方符号
命令行查找第三方符号
稍微大点的项目都会引入第三方库,有时候需要查询某个符号在哪些库中存在。比如说,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
}
命令行查找第三方符号