oclint自定義規則的編寫,通常咱們會生成xcode工程,而後進行編碼,build以後會輸出dylib。若是咱們要驗證規則的正確性,只能把dylib拷貝到rules的目錄中,而後在進行測試。這樣實在是很麻煩,也只能經過log來輸出信息,然而clang的方法那麼多,單靠log方式也不便於調試。因而在想如何在XCode中進行調試。但搜了不少方法,一直沒成功。html
這裏有一個方案:OCLint自定義規則的調試方法,可是不知道他的oclintexe是怎麼寫的,我本身嘗試新建Command Line Tool的工程,而後用NSTask調起oclint的命令,仍是沒能斷點到,多是個人實現有問題。git
後來又發現了一個答案,How to launch OCLint in xcode with debug model.,也是討論如何在xcode中進行調試的。一開始沒明白答案中步驟的意思,一直無果,忽然有一天開竅了。 used the cmake tool, create xcode project with each module
,看到了each module
。而後就想到,在建立rule的時候,不也是經過如下cmake命令生成的xcode工程,LLVM_ROOT指向的是oclint-rules。github
#! /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
複製代碼
後來發現oclint目錄下還有好幾個文件夾,oclint-core,oclint-driver,oclint-metrics,oclint-reporters,countly等,是均可以生成xcode工程的。而後,按照步驟,一個個生成了xcode工程,而後進行編譯。發現oclint-driver這個工程是能夠直接跑起oclint的,大喜。objective-c
不過最終也不須要答案中的那麼複雜,只須要生成oclint-driver的xcode工程編譯便可。xcode
下面來具體說下調試的步驟。bash
若是有不清楚oclint如何編寫自定義規則的,請看這裏:Code Review-OCLint系列開篇app
寫的比較詳細,一步步操做下來就好。不過在編譯源碼以前,須要安裝好所需的環境。兩個命令就好。測試
brew install subversion git cmake lcov openssl
brew install ninja
複製代碼
(1) 首先生成oclint-xcoderules的xcode工程。按上面的教程來。 (2) 生成oclint-driver的xcode工程,只需把腳本改爲LLVM_ROOT = oclint_drivers的目錄。ui
cd oclint
mkdir oclint-xcodedriver
cd oclint-xcodedriver
touch create.sh
chmod +x create.sh
複製代碼
create.sh腳本內容以下:編碼
#! /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
複製代碼
最後執行./create.sh,便可生成oclint-driver的xcode工程。
(3)可是在xcode中編譯oclint-driver的時候,我這邊出現了報錯問題。若是你也碰到一樣的問題,能夠這樣解決。
在編譯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時,出現-lcountly
找不到的狀況。這是由於Library path沒有配置countly的路徑。
一樣在build settings->Library Search Paths,添加lib路徑。/Users/liusilan/Documents/workspace/my/opensource/oclint/build/countly/lib
,這裏改爲本身的路徑。
而後build,就能夠成功的跑起oclint了。
(4) 因爲咱們須要調試自定義規則,就須要在剛能跑起來的oclint中調起規則,oclint有個參數-R,表示rule所在文件夾路徑。經過Arguments Passed On Lanunch的方式,能夠添加參數。
自定義rule的dylib的輸出路徑是
/Users/liusilan/Documents/workspace/my/opensource/oclint/oclint-xcoderules/rules.dl/Debug
複製代碼
把這個參數傳進去就能夠。而後再添加須要檢查的文件,輸出格式,系統頭文件路徑等。
總的參數以下:
-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
複製代碼
注意:若是出現'stdarg.h' file not found
的報錯,則須要添加clang的頭文件路徑。
-isystem /Users/liusilan/Documents/workspace/my/opensource/oclint/build/oclint-release/lib/clang/5.0.0/include
複製代碼
(5)按照這種方式的話,須要把自定義的規則先生成好。但每次改動了,都要去oclint-rule的工程中去跑一遍,稍顯麻煩。能夠直接把oclint-rule的xcode工程做爲oclint-driver的子工程,而後設置target依賴於你要調試的rule的target便可。這樣,在跑oclint的時候,就會先編譯好自定義的規則了。
(6)一切都配置好以後,在自定義規則裏打好斷點,run起來,又出現了一個問題😯,cannot find dynamic library for report type:html
。在工程中搜索了下,發現是在目錄下找不到對應的libray。因而,斷點在這。看reportDirPath是指向的哪一個路徑。
結果是
"/Users/liusilan/Documents/workspace/my/opensource/oclint/oclint-xcode-driver/bin/Debug/../lib/oclint/reporters"
複製代碼
的確這個路徑下是沒有libHTMLReporter.dylib,爲了方便,索性直接將整個reporters /Users/liusilan/Documents/workspace/my/opensource/oclint/build/oclint-reporters/reporters.dl
拷貝到了上面的路徑。
最後,一切都順利了,成功調試。