oclint自定義規(guī)則的編寫,一般我們會生成xcode工程,然后進行編碼,build之后會輸出dylib。如果我們要驗證規(guī)則的正確性,只能把dylib拷貝到rules的目錄中,然后在進行測試。這樣實在是很麻煩,也只能通過log來輸出信息,然而clang的方法那么多,單靠log方式也不便于調(diào)試。于是在想如何在XCode中進行調(diào)試。但搜了很多方法,一直沒成功。
這里有一個方案:OCLint自定義規(guī)則的調(diào)試方法,但是不知道他的oclintexe是怎么寫的,我自己嘗試新建Command Line Tool的工程,然后用NSTask調(diào)起oclint的命令,還是沒能斷點到,可能是我的實現(xiàn)有問題。
后來又發(fā)現(xiàn)了一個答案,How to launch OCLint in xcode with debug model.,也是討論如何在xcode中進行調(diào)試的。一開始沒明白答案中步驟的意思,一直無果,突然有一天開竅了。
used the cmake tool, create xcode project with each module,看到了each module。然后就想到,在創(chuàng)建rule的時候,不也是通過以下cmake命令生成的xcode工程,LLVM_ROOT指向的是oclint-rules。
#! /bin/sh -e
cmake -G Xcode \
-D CMAKE_CXX_COMPILER=../build/llvm-install/bin/clang++ \
-D CMAKE_C_COMPILER=../build/llvm-install/bin/clang \
-D OCLINT_BUILD_DIR=../build/oclint-core \
-D OCLINT_SOURCE_DIR=../oclint-core \
-D OCLINT_METRICS_SOURCE_DIR=../oclint-metrics \
-D OCLINT_METRICS_BUILD_DIR=../build/oclint-metrics \
-D LLVM_ROOT=../build/llvm-install/ ../oclint-rules
后來發(fā)現(xiàn)oclint目錄下還有好幾個文件夾,oclint-core,oclint-driver,oclint-metrics,oclint-reporters,countly等,是都可以生成xcode工程的。然后,按照步驟,一個個生成了xcode工程,然后進行編譯。發(fā)現(xiàn)oclint-driver這個工程是可以直接跑起oclint的,大喜。
不過最終也不需要答案中的那么復(fù)雜,只需要生成oclint-driver的xcode工程編譯即可。
下面來具體說下調(diào)試的步驟。
調(diào)試步驟
如果有不清楚oclint如何編寫自定義規(guī)則的,請看這里:Code Review-OCLint系列開篇
寫的比較詳細(xì),一步步操作下來就好。不過在編譯源碼之前,需要安裝好所需的環(huán)境。兩個命令就好。
brew install subversion git cmake lcov openssl
brew install ninja
(1) 首先生成oclint-xcoderules的xcode工程。按上面的教程來。
(2) 生成oclint-driver的xcode工程,只需把腳本改成LLVM_ROOT = oclint_drivers的目錄。
cd oclint
mkdir oclint-xcodedriver
cd oclint-xcodedriver
touch create.sh
chmod +x create.sh
create.sh腳本內(nèi)容如下:
#! /bin/sh -e
cmake -G Xcode \
-D CMAKE_CXX_COMPILER=../build/llvm-install/bin/clang++ \
-D CMAKE_C_COMPILER=../build/llvm-install/bin/clang \
-D OCLINT_BUILD_DIR=../build/oclint-core \
-D OCLINT_SOURCE_DIR=../oclint-core \
-D OCLINT_METRICS_SOURCE_DIR=../oclint-metrics \
-D OCLINT_METRICS_BUILD_DIR=../build/oclint-metrics \
-D LLVM_ROOT=../build/llvm-install/ ../oclint_drivers
最后執(zhí)行./create.sh,即可生成oclint-driver的xcode工程。
(3)但是在xcode中編譯oclint-driver的時候,我這邊出現(xiàn)了報錯問題。如果你也碰到同樣的問題,可以這樣解決。
-
在編譯OCLintDriver.a庫的時候,報錯。
<countly/Countly.h>找不到。是因為Header Search Paths沒配置countly頭文件的路徑。切到OCLintDriver target的build settings--->Header Search Paths,添加
/Users/liusilan/Documents/workspace/my/opensource/oclint/countly/include,這里改成自己的路徑。 -
在編譯oclint-0.13的target時,出現(xiàn)
-lcountly找不到的情況。這是因為Library path沒有配置countly的路徑。同樣在build settings->Library Search Paths,添加lib路徑。
/Users/liusilan/Documents/workspace/my/opensource/oclint/build/countly/lib,這里改成自己的路徑。然后build,就可以成功的跑起oclint了。
(4) 由于我們需要調(diào)試自定義規(guī)則,就需要在剛能跑起來的oclint中調(diào)起規(guī)則,oclint有個參數(shù)-R,表示rule所在文件夾路徑。通過Arguments Passed On Lanunch的方式,可以添加參數(shù)。
自定義rule的dylib的輸出路徑是
/Users/liusilan/Documents/workspace/my/opensource/oclint/oclint-xcoderules/rules.dl/Debug
把這個參數(shù)傳進去就可以。然后再添加需要檢查的文件,輸出格式,系統(tǒng)頭文件路徑等。

總的參數(shù)如下:
-R=/Users/liusilan/Documents/workspace/my/opensource/oclint/oclint-xcoderules/rules.dl/Debug -report-type html -o /Users/liusilan/Documents/workspace/my/demo/Demo/reporter.html /Users/liusilan/Documents/workspace/my/demo/Demo/Demo/Test.m -- -x objective-c -isystem /Users/liusilan/Documents/workspace/my/opensource/oclint/build/oclint-release/lib/clang/5.0.0/include -iframework /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/System/Library/Frameworks -isystem /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk/usr/include
注意:如果出現(xiàn)'stdarg.h' file not found的報錯,則需要添加clang的頭文件路徑。
-isystem /Users/liusilan/Documents/workspace/my/opensource/oclint/build/oclint-release/lib/clang/5.0.0/include
(5)按照這種方式的話,需要把自定義的規(guī)則先生成好。但每次改動了,都要去oclint-rule的工程中去跑一遍,稍顯麻煩。可以直接把oclint-rule的xcode工程作為oclint-driver的子工程,然后設(shè)置target依賴于你要調(diào)試的rule的target即可。這樣,在跑oclint的時候,就會先編譯好自定義的規(guī)則了。

(6)一切都配置好之后,在自定義規(guī)則里打好斷點,run起來,又出現(xiàn)了一個問題??,cannot find dynamic library for report type:html。在工程中搜索了下,發(fā)現(xiàn)是在目錄下找不到對應(yīng)的libray。于是,斷點在這??磖eportDirPath是指向的哪個路徑。

結(jié)果是
"/Users/liusilan/Documents/workspace/my/opensource/oclint/oclint-xcode-driver/bin/Debug/../lib/oclint/reporters"
的確這個路徑下是沒有l(wèi)ibHTMLReporter.dylib,為了方便,索性直接將整個reporters
/Users/liusilan/Documents/workspace/my/opensource/oclint/build/oclint-reporters/reporters.dl拷貝到了上面的路徑。
最后,一切都順利了,成功調(diào)試。
