XcodeZombieCode
XcodeZombieCode copied to clipboard
有关于此项目的任何问题,都请在此处留言,我会在看到且有空的第一时间回复。
你好,目前我在使用此项目时有以下疑问: 1、在xocde中直接编译ClangZombieCodePlugin插件可以编译成功,但是在直接编译XcodeZombieCodeDemo失败,是因为OTHER_CFLAGS配置的插件路径错误,配置路径是/opt/local/lib/clangplugin/libClangZombieCodePlugin.dylib,正确路径应该是/opt/llvm/clangplugin/libClangZombieCodePlugin.dylib,换成正确的路径之后,可以编译成功,但是在外层的Analyzer文件夹里面并没有生成.jsonpart中间文件。 2、如果成功生成了.jsonpart中间文件,是否只要运行XcodeZombieCodeAnalyzer编译出的可执行文件技能生成最终的json文件?
@smileagainluo dylib生成好的情况下,需要确认自己使用的compiler是Clang LLVM Trunk(工程设置里面的Compiler for C/C++/Objective-C),并修改OTHER_CFLAGS使clang载入相应的插件和参数,如I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 -mios-version-min=8.0 -Xclang -load -Xclang /opt/local/lib/clangplugin/libClangZombieCodePlugin.dylib -Xclang -add-plugin -Xclang ClangZombieCodePlugin -Xclang -plugin-arg-ClangZombieCodePlugin -Xclang $SRCROOT 这样做,实际上就是把命令行里clang载入插件和参数的方式应用到了xcode中去,没问题的话就可以生成Analyzer中的中间文件了; 对于jsonpart文件,是纯json样式的,需要写一个分析工具去分析,我的工程里XcodeZombieCodeAnalyzer(开源的)是一个通用的例子,可能需要针对自己具体情况做必要的改动。
@kangwang1988 现在我编译demo工程已经可以生成.jsonpart文件,也可以用你的工具分析出重复/无用的方法。但是我在我们的工程上使用插件时,我配置了compiler为Clang LLVM Trunk,OTHER_CFLAGS为I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 -mios-version-min=8.0 -Xclang -load -Xclang /opt/local/lib/clangplugin/libClangZombieCodePlugin.dylib -Xclang -add-plugin -Xclang ClangZombieCodePlugin -Xclang -plugin-arg-ClangZombieCodePlugin -Xclang $SRCROOT,编译报错“no such file or directory: 'I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1'”,我把前面的I去掉之后,还是报错“clang-3.9: error: cannot specify -o when generating multiple output files”,不知道是不是哪里配置有问题
@smileagainluo I是Include的意思,是说包含后面的路径作为Include的一部分,如果你要去掉I,就把整个I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1都去掉好了。只是不知道这样会不会报错,如果你引用C++的头文件。
@kangwang1988 其实我机器上是有/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1这个目录的,感觉是这个I没有被识别为include。我去掉这句话后还是报错,"error: unable to load plugin '/opt/local/lib/clangplugin/libClangZombieCodePlugin.dylib': 'dlopen(/opt/local/lib/clangplugin/libClangZombieCodePlugin.dylib, 9): image not found',这个目录确实没有dylib文件,不知道demo工程为什么没有报错,我把插件路径改成/opt/llvm/clangplugin/libClangZombieCodePlugin.dylib后,还是报错,“clang-3.9: error: invalid version number in '-miphoneos-version-min=10.1'”,你可以用xcode新建一个工程试一下
@smileagainluo 这个错误和你当前的deployTarget有关系,假如你的deploytarget是10.1,那么cflags里面也是10.1即I/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1 -mios-version-min=10.1 -Xclang -load -Xclang /opt/local/lib/clangplugin/libClangZombieCodePlugin.dylib -Xclang -add-plugin -Xclang ClangZombieCodePlugin -Xclang -plugin-arg-ClangZombieCodePlugin -Xclang $SRCROOT
@kangwang1988 改了之后还是报同样的错误,XcodeZombieCodeDemo的deployTarget是10.0,但是并没有报错。
clang-3.9: error: invalid version number in '-miphoneos-version-min=10.1' 这个错误和你deploytarget有关系,-mios-version-min=10.1这里设置好就可以的,你可以参考下我写的。
Error:Filename not set null 怎么回事?
之前没有接触过clang插件相关的内容,菜鸟求教,目前按照文章的做法,到clang的源码安装编译都ok,但插件的编译生成这部分一直失败。 我首先使用了命令行的方法,提示的错误如:
Undefined symbols for architecture x86_64:
"ZombieCodeUtil::setFilename(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, bool)", referenced from:
ZombieCode::ZombieCodeASTVisitor::VisitDecl(clang::Decl*) in ClangZombieCodePlugin-ab8b2b.o
ZombieCode::ZombieCodeASTVisitor::VisitStmt(clang::Stmt*) in ClangZombieCodePlugin-ab8b2b.o
对于这个错误在完全摸不着头脑的google了半天以后,没有任何头绪和进展,逐准备先尝试下在xcode里编译生成的方式。 之前自己也建过dylib工程,在C++环境下编译生成过dylib,并没有遇到过什么特殊的问题,不过在demo工程里编译生成失败了,错误如下:
Undefined symbols for architecture x86_64:
"llvm::itaniumDemangle(char const*, char*, unsigned long*, int*)", referenced from:
llvm::sys::PrintStackTrace(llvm::raw_ostream&) in libLLVMSupport.a(Signals.cpp.o)
ld: symbol(s) not found for architecture x86_64
根据错误提示,我尝试从llvm_build/lib中找到了libLLVMSupport.a加入到library中,但依然提示改错误: 我的Library情况如下,libz.tbd是之前demo中就在的了, 然后目前OTHER_CFLAGS里还没有设置任何命令行,因为看文章教程,这个应该是dylib编译生成完以后的事情。
再此求教是哪里有问题导致编译生成的?感谢~!
XcodeZombieCodeDemo编译过程中有生成json文件,但是编译结束就消失了。这是什么问题?
@loveace json文件的生成是在编译过程中产生的,工程文件的开始和结束会基于pre/post action对json/.jsonpart文件做处理,是两个shell文件,位于analyzer里面,不妨看看。
@snakeD 第一个问题是说符号没找到,命令行编译的时候是不是没有链接ZombieCodeUtil.cpp这个文件呢?setFilename这个符号是在那个文件下的。
我知道你说的 shell,问题是 XcodeZombieCodeAnalyzer不是需要jsonpart文件的么?现在 run XcodeZombieCodeDemo结束后jsonpart文件就没了。。
@loveace jsonpart的删除是在shell里操作的,我的逻辑是利用pre/post去运行Analyzer,使用完毕就删除jsonpart文件,你如果要看其中的内容,可以修改shell里面关于移除jsonpart的逻辑。
现在是Analyzer还没使用到jsonpart,jsonpart就被删除了。所以导致Analyzer生成的json文件里面内容都是空的。想问下你的 pre/post 脚本执行的逻辑是怎么样?我在xcode里面搜索,并没有看到有调用pre/post脚本的逻辑。
@loveace 看下你的工程对应的scheme,run里面包括了pre/post action。你可以先移除shell里面的逻辑,再看看是不是移调此逻辑之后jsonpart就有了。
了解了,在scheme的build里面调用了pre/post action。在post sh里面有:
删除操作。这里不是很理解。都还没有Analyzer,为什么就把jsonpart删掉了?
@loveace 因为我已经跑完分析工具了呀 [捂脸] 看上面的$dir/XcodeZombieCodeAnalyzer $dir AppDelegate这句。
我理解的步骤: 1.run ClangZombieCodePlugin 生成clang的插件。 2.利用1生成的插件build XcodeZombieCodeDEMO,生成jsonpart文件。 3.run XcodeZombieCodeAnalyzer,对2生成的jsonpart文件进行分析,最终得出json文件。
现在脚本的执行是在2的build步骤,也就是3都没有分析:
你说的跑完分析工具是什么意思?难道先执行3再执行2么?2都没执行,没有jsonpart文件,你分析什么呢?
sorry,我理解错了。post脚本里面就是执行 analyer的 。
项目中使用cocoapods。如何针对某个pod包,进行代码分析?
@loveace 分析工具面对的对象时源代码,首先你得pod要以源码存在,剩下的和你现在处理的自己的工程一样的,xcode选择自己的clang,载入相应的dylib分析代码和相应的命令行参数就行了。
你说的都理解。你的demo中参数中最后有个:$SRCROOT/.. 应该是指分析项目根目录下的所有文件。如果是某个pod,命令行参数应该怎么写?
@kangwang1988 第二种在xcode下直接编译的问题呢?我是直接下载了demo编译的 bulding setting中的配置没有动
@snakeD 我看了下我本地的代码 是release_39的代码,我这边的代码里是没有你说的Demangle文件的。signals.cpp也没有类似的符号引用。你确认下你使用的代码版本与分支。
试了下,增加-Xclang $SRCROOT/.. /xxx/xxx/xxx 指定到具体某个pod的方式。不可行。。。目前demo的方式只适用于全盘扫描分析项目的整个源码。
@loveace 你有源码啊,具体要不要分析一个文件本来就可以改动的。再者,分析无用代码的话肯定是要全工程扫描的呀。
比如一些第三方库的话,我不想去分析它。所以只针对某些文件夹里的源码做分析。demo目前还做不到啊。。
@kangwang1988 感谢,是其中一个llvm包的版本问题