如何調(diào)試OCLint自定義規(guī)則

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)頭文件路徑等。

QQ20171209-1.png

總的參數(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ī)則了。


QQ20171209-2.png

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

QQ20171209-3.png

結(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)試。


QQ20171209-4.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,021評論 25 709
  • 因為要結(jié)局swift3.0中引用snapKit的問題,看到一篇介紹Xcode8,swift3變化的文章,覺得很詳細(xì)...
    uniapp閱讀 4,872評論 0 12
  • 總有一些美好,是不會隨著時間而被忘記的。——佚名 每年都有這樣的日子,感覺自己成熟了,長大了,也是老了。 這一年真...
    夜神滅閱讀 196評論 0 0
  • 運籌于手掌之間,那些筒子、條子、萬子,張張都充滿了未知。 這是四個人的游戲,樂此不疲地將那座方城...
    櫻子四妹閱讀 456評論 7 3
  • 10月的太原秋意盎然,幾場秋雨過后,天氣愈加寒冷。但太原的眾多城市建設(shè)卻如火如荼的進行著收尾工作,漪汾街下月竣工通...
    非常努力閱讀 600評論 0 0

友情鏈接更多精彩內(nèi)容