漫談LLDB:SBExpressionOptions簡介

漫談LLDB:SBExpressionOptions簡介

前言

首先要說明的是,這篇文章只是總結個人經驗,不保證徹底正確。若有錯漏還望讀者留言指正。
之因此要寫這篇文章,是由於個人開源項目HMLLDB有個核心的函數HMLLDBHelpers.evaluateExpressionValue,裏面用到了SBExpressionOptions這個選項,若是不說明一下,將來要寫的相關文章都很差交代。
另外LLDB自帶的expression命令有些選項和SBExpressionOptions是對應關係,讀者能夠根據名稱對比一下。git

SBExpressionOptions是什麼

若是有用過SB API的話, 確定對SBExpressionOptions有印象,不管是SBTarget仍是SBFrame都有一個EvaluateExpression函數用於執行代碼表達式(二者有區別,之後有機會再談),而這個函數參數支持傳入一個SBExpressionOptions對象,看名稱就知道是幹什麼的,附上官方文檔對此類的說明:github

A container for options to use when evaluating expressions.express

SBExpressionOptions方法解釋

方法 解釋
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,通常經常使用eLanguageTypeObjCeLanguageTypeObjC_plus_pluseLanguageTypeSwift。不設置則會根據上下文推斷語言類型
SetSuppressPersistentResult 設置爲True,表達式結果就不會持久化。另外須要注意的是,LLDB的即時編譯沒有自動插入ARC釋放的代碼,表達式內alloc的對象,並不會釋放,因此未釋放對象和此項配置無關
SetPrefix 設置表達式前綴。LLDB中常常要使用typedef,能夠先配置好,另外也能夠配置宏定義
SetAutoApplyFixIts 設置爲True,若是表達式有簡單的拼寫錯誤,會自動修正
SetRetriesWithFixIts 嘗試修正的次數(Xcode 12.5新增)
SetTopLevel 是否忽略上下文,將表達式解析爲頂級的實體。好比能夠設爲True,在表達式裏定義一個C語言的外部函數或外部變量。
SetAllowJIT 若是不能解析表達式,是否進行即時編譯

SBExpressionOptions的默認值

安裝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

HMLLDB項目的配置

相關的配置在HMLLDBHelpers.py文件的evaluateExpressionValue函數中能看到。函數

方法 配置
SetCoerceResultToId False,由於返回的是SBValueSBValue可操做性更強
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,大部分功能都是必要的。

相關文章

相關文章
相關標籤/搜索