命令行查找第三方符号

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

时间: 2024-08-07 14:33:07

命令行查找第三方符号的相关文章

c语言中命令行参数argc,argv[ ]

main(int argc,char *argv[ ]) argv为指针的指针 argc为整数 char **argv or: char *argv[] or: char argv[][] main()括号内是固定的写法. 下面给出一个例子来理解这两个参数的用法: 假设程序的名称为prog, 当只输入prog,则由操作系统传来的参数为: argc=1,表示只有一程序名称. argc只有一个元素,argv[0]指向输入的程序路径及名称:./prog 当输入prog para_1,有一个参数,则由操

RH124之访问命令行(1)

ctrl+u  从当前删除到开头 [[email protected] ~]# #abcdefg [[email protected] ~]# ctrl+k  从当前删除到结尾 [[email protected] ~]# AAAaaaBBB [[email protected] ~]#AAA ESE + . 返回上一次命令后的参数:如果只有一个命令,那么只返回该命令 [[email protected] ~]# ls anaconda-ks.cfg [[email protected] ~]#

命令行参数,多数相加

题目要求:1编写一个程序,此程序从命令行接收多个数字,求和之后输出结果. 2命令行参数都是字符串,必须先将其转化为数字,才能相加. 设计思想: 没有规定要输入多少个数字,String args[]可以很好的解决这个问题,动态的存入输入的数,但存入的数是以字符的形式存储的,那就需要一个函数可以将字符型的数据转换成整数,就用到了Integer.parseInt()函数,它的使用形式为Integer.parseInt(任意形式,n)n是需要转换的整数进制,如Integer.parseInt(args[

Maven 手动添加第三方依赖包及编译打包和java命令行编译JAVA文件并使用jar命令打包

一,实例:新建了一个Maven项目,在eclipse中通过 build path –> configure path-.将依赖包添加到工程中后,eclipse不报错了.但是用Maven命令 mvn clean compile 时出错如下: 原因是在eclipse中添加了 exteneral jar后,还需要在maven中再添加依赖的jar包 Maven手动添加第三方依赖包有两种方法: 参考:maven 添加第三方依赖              maven中把依赖的JAR包一起打包 第一种方法是使

Mac上通过Linux命令行批量查找和替换文本

一般在本地电脑上批量替换文本有许多工具可以做到,比如Emeditor,sublime text ,但在linux和mac上相关的编辑器有这个功能的不多,另外大多服务器上都是无图形界面的,因此收集了几条针对linux命令行备忘,实现批量替换文本内容的命令: 批量查找某个目下文件的包含的内容 grep -rn "要找查找的文本" ./ 通过sed批量查找并替换文件内容. sed -i "s/要找查找的文本/替换后的文本/g"grep -rl "要找查找的文本&

批处理第三方命令行工具汇总(转)

名称 版本 功能简介 下载地址 BatProject.exe 0.5 批处理编辑器 http://www.bathome.net/thread-7186-1-1.html CWnd.exe N/A 窗口.句柄.进程操作 http://www.bathome.net/thread-5778-1-1.html Sum.exe N/A MD5.CRC.BASE64.SHA1加密字符串 http://www.bathome.net/thread-5954-1-1.html TimeBack.exe 1.

Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参

Java项目导出为jar包+导出第三方jar包+使用命令行调用+传参 一.打包 情况1:不需要向程序传参数,并且程序没有使用第三方jar包 Eclipse上导出jar: 然后选择一个java文件作为入库,需要带main()主函数: 情况2:向程序传参数,并且程序没有使用第三方jar包 这种情形下打包和情况1是一样的 情况3:程序使用了第三方jar包 这种情况下的打包要复杂一些,需要把第三方jar包一起导出,可以使用eclipse的插件fat jar,很简便,但是fat jar只支持eclipse

使用Java命令行方式导入第三方jar包来运行Java程序的命令

1.首先使用命令行进入到a.java所在的文件夹:(比如我的在D:\javaeeworkspace\SharedPS_WS\src\com\dyf\main 这样一个路径下,) d: 回车, cd D:\javaeeworkspace\SharedPS_WS\src\com\dyf\main 回车, 2.使用javac命令运行a.java源文件,运行时需要使用到第三方jar包时,使用 –classpath参数来指定jar包所在路径: 比如我的cxf框架的jar包在 C:\D\Java\cxf\a

Linux查找并删除重复文件的命令行fdupes工具,dupeGuru图形工具

查了几十个网页,找到这个接近满意的解决方案http://unix.stackexchange.com/questions/146197/fdupes-delete-files-aft... 不过正则里面的叹号好像不能起到清除空行的效果,改为d;fdupes --recurse A/ B/ | sed '/^A/d; /^$/d; s/.*/"&"/' | xargs rm 但还有个小问题,如果A里面有重复的文件,但这文件不在B中,fdupes也是会列为结果,导致误删,要再想想