首先要說明的是,這篇文章只是總結個人經驗,不保證徹底正確。若有錯漏還望讀者留言指正。
之因此要寫這篇文章,是由於個人開源項目HMLLDB有個核心的函數HMLLDBHelpers.evaluateExpressionValue
,裏面用到了SBExpressionOptions這個選項,若是不說明一下,將來要寫的相關文章都很差交代。
另外LLDB自帶的expression
命令有些選項和SBExpressionOptions是對應關係,讀者能夠根據名稱對比一下。git
若是有用過SB API的話, 確定對SBExpressionOptions有印象,不管是SBTarget仍是SBFrame都有一個EvaluateExpression
函數用於執行代碼表達式(二者有區別,之後有機會再談),而這個函數參數支持傳入一個SBExpressionOptions對象,看名稱就知道是幹什麼的,附上官方文檔對此類的說明:github
A container for options to use when evaluating expressions.express
方法 | 解釋 |
---|---|
SetCoerceResultToId | 執行表達式後,是否將結果強制轉換爲id類型 |
SetFetchDynamicValue | 可將結果轉換爲動態類型。能夠設置3個值,依次是eNoDynamicValues (0),eDynamicCanRunTarget (1),eDynamicDontRunTarget (2)。若是一個NSArray * 對象,0表示爲NSArray * 類型,一、2則表示爲__NSArrayI * 類型 |
SetUnwindOnError | 是否在錯誤時回溯堆棧信息 |
SetIgnoreBreakpoints | 執行表達式時,是否忽略斷點的命中 |
SetGenerateDebugInfo | 官方給出的解釋是設置是否爲表達式生成調試信息,還控制是否生成SBModule。但我卻沒測試出區別,還不瞭解 |
SetTimeoutInMicroSeconds | 執行表達式的超時時間,單位爲微秒,設置爲0則永不超時 |
SetOneThreadTimeoutInMicroSeconds | 執行表達式在一個線程上的超時時間,微秒,必須小於GetTimeoutInMicroSeconds的值 |
SetTryAllThreads | 若是表達式在一個線程上未完成,是否運行全部的線程 |
SetStopOthers | 執行表達式時是否中止其餘線程 |
SetTrapExceptions | 若是執行表達式引起了異常,是否停止執行 |
SetPlaygroundTransformEnabled | 這個函數官網文檔沒有,源碼也沒有,意義不明 |
SetREPLMode | 這個函數官網文檔沒有,源碼也沒有,意義不明 |
SetLanguage | 設置表達式所用的語言LanguageType,通常經常使用eLanguageTypeObjC 、eLanguageTypeObjC_plus_plus 、eLanguageTypeSwift 。不設置則會根據上下文推斷語言類型 |
SetSuppressPersistentResult | 設置爲True,表達式結果就不會持久化。另外須要注意的是,LLDB的即時編譯沒有自動插入ARC釋放的代碼,表達式內alloc的對象,並不會釋放,因此未釋放對象和此項配置無關 |
SetPrefix | 設置表達式前綴。LLDB中常常要使用typedef,能夠先配置好,另外也能夠配置宏定義 |
SetAutoApplyFixIts | 設置爲True,若是表達式有簡單的拼寫錯誤,會自動修正 |
SetRetriesWithFixIts | 嘗試修正的次數(Xcode 12.5新增) |
SetTopLevel | 是否忽略上下文,將表達式解析爲頂級的實體。好比能夠設爲True,在表達式裏定義一個C語言的外部函數或外部變量。 |
SetAllowJIT | 若是不能解析表達式,是否進行即時編譯 |
安裝HMLLDB,隨便運行一個iOS項目,進入LLDB調試模式後,能夠經過plldbClassInfo SBExpressionOptions
命令查看其默認值markdown
方法 | 默認值 |
---|---|
GetCoerceResultToId | False |
GetFetchDynamicValue | 0,即eNoDynamicValues |
GetUnwindOnError | True |
GetIgnoreBreakpoints | False |
GetGenerateDebugInfo | False |
GetTimeoutInMicroSeconds | 500000 |
GetOneThreadTimeoutInMicroSeconds | 0 |
GetTryAllThreads | True |
GetStopOthers | True |
GetTrapExceptions | True |
GetPlaygroundTransformEnabled | False |
GetREPLMode | False |
SetLanguage | 沒有對應的Get方法,不設置則會根據上下文推斷語言類型。 |
GetSuppressPersistentResult | False |
GetPrefix | None |
GetAutoApplyFixIts | True |
GetRetriesWithFixIts | 1 |
GetTopLevel | False |
GetAllowJIT | True |
相關的配置在HMLLDBHelpers.py文件的evaluateExpressionValue
函數中能看到。函數
方法 | 配置 |
---|---|
SetCoerceResultToId | False,由於返回的是SBValue,SBValue可操做性更強 |
SetFetchDynamicValue | eNoDynamicValues (0),由於返回的是SBValue,自己就能夠獲取動態類型值,這樣設置能保證最大的可操做性 |
SetUnwindOnError | True,LLDB執行不穩定,有堆棧信息可更好debug |
SetIgnoreBreakpoints | True,HMLLDB全部命令都不須要命中斷點而中斷 |
SetGenerateDebugInfo | False,不瞭解,保持默認值 |
SetTimeoutInMicroSeconds | 5000000,即5秒 |
SetOneThreadTimeoutInMicroSeconds | 4900000,即4.9秒。當SetTryAllThreads和SetStopOthers都設爲True時,這個方法設置的值最好略小於GetTimeoutInMicroSeconds |
SetTryAllThreads | True,不瞭解,保持默認值 |
SetStopOthers | True,不瞭解,看字面意思,設置爲True能保證執行時的穩定性 |
SetTrapExceptions | False,HMLLDB有Traceback機制,此項配置意義不大。若是大部分狀況下都是runtime錯誤,設置爲False可以讓系統自動捕獲 |
SetPlaygroundTransformEnabled | False,意義不明,保持默認 |
SetREPLMode | False,意義不明,保持默認 |
SetLanguage | eLanguageTypeObjC_plus_plus ,OC比Swift穩定,且HMLLDB項目使用了大量的objc_msgSend 函數,故不選用Swift。選OC++則是爲了增長兼容性 |
SetSuppressPersistentResult | True,表達式結果不須要持久化 |
SetPrefix | 具體內容能夠查看HMExpressionPrefix.py文件。根據表達式實際狀況,按需配置 |
SetAutoApplyFixIts | True,HMLLDB是固定的代碼,此項配置意義不大,保持默認 |
SetRetriesWithFixIts | 1,HMLLDB是固定的代碼,此項配置意義不大,保持默認 |
SetTopLevel | False,目前功能暫時不須要定義外部函數和外部變量,將來可期 |
SetAllowJIT | True,大部分功能都是必要的。 |