1. 程式人生 > >命令行查找第三方符號

命令行查找第三方符號

不知道 字符串分割 由於 ras ole 原因 earch eval 需要

  稍微大點的項目都會引入第三方庫,有時候需要查詢某個符號在哪些庫中存在。比如說,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
}

命令行查找第三方符號