更新:這個先前的 Xcode 外掛程式已被重新組織成 Swift 包,以便在其他應用程式中使用。在客戶端應用程式中使用Xprobe
產品,在伺服器端使用XprobeUI
產品。
XprobePlugin 為您提供了應用程式內部物件的視圖,可以詳細到 ivars 級別,也可以全域顯示主要物件及其連接方式的圖表。此顯示可以即時動畫化,在發送訊息時以紅色物件突出顯示以及訊息流動的路徑。這是透過執行「掃描」自動完成的,以查找一組種子引用的所有物件、它們引用的物件、那些引用的物件等等,以建立可以在 Xcode 中顯示的活動物件清單:
在模擬器中,記憶體清理器是使用 lldb 從插件內的捆綁包載入的,無需更改應用程式的專案來源。要使用該插件,請建立此專案並重新啟動 Xcode。應用程式運行後,使用選單項目「Product/Xprobe/Load」載入應用程式記憶體掃描的初始視圖。如果您是插件開發人員,您可以使用「Product/Xprobe/Xcode」來檢查 Xcode 應用程式本身的物件。
然後,您可以使用模式過濾應用程式中列出的物件或其方法。如果沒有與該模式相符的物件且它是一個類別名,則會顯示該名稱。以“+”或“-”為前綴的模式將搜尋連結到應用程式的所有類別以查找與該模式相符的方法。可以輸入前綴為“0x”的原始指標來檢查作為參數傳遞給追蹤的物件。您也可以輸入以“種子”開頭的物件“路徑”。從您瀏覽應用程式時記錄的路徑中,您可以輕鬆找到返回物件的路徑。
如果您安裝了injectionforxcode插件,Xprobe將允許您針對選定的實例評估Objective-C或Swift,您有來源在執行時間記錄或修改物件狀態的任何方面。
Xprobe.mm 現在可以在發生錯誤時將您的應用程式快照到獨立的 html 檔案。這會執行掃描,並記錄錯誤發生時應用程式的狀態以供以後分析。可以在此處查看 ReactNative 範例專案「TickTackToe」的範例快照檔案。
要拍攝快照,請在您的應用程式中包含 Xprobe.mm 並使用以下呼叫:
[Xprobe snapshot: @" /path/to/snapshot.html.gz " seeds: @[app delegate, rootViewController]];
如果遇到困難,您可以變更類別名稱的模式,以便不使用附加的排除:(NSString *)模式參數來擷取。預設值為:
@" ^(?:UI|NS((Object|URL|Proxy)$|Text|Layout|Index|.*(Map|Data|Font))|Web|WAK|SwiftObject|XC|IDE|DVT|Xcode3|IB|VK) "
其餘功能最容易透過一系列要點來展開:
按一下物件的連結以查看其 ivar 內容。
再次按一下該連結可關閉詳細資料視圖。
點擊超類別連結查看其 ivars
按一下 ivar 名稱可從應用程式刷新其值
點擊 ivar 值以在應用程式中編輯和設定其值
可以查看類別的屬性、方法和任何協定。
可以搜尋方法列表(也可以找超類別方法)
使用“trace”連結開始記錄對該實例上的方法的呼叫。
若要查看為某個物件追蹤的所有方法,請按一下每個類別的「追蹤」。
可以使用正規表示式過濾追蹤輸出
子視圖連結將遞歸地顯示視圖下的子視圖樹。
當物件是視圖時,“渲染”連結將捕獲圖像。
兄弟連結將顯示所有找到的共享該物件類別的物件。
透過在搜尋欄位中鍵入 Enter 來刷新物件清單以強制進行新的掃描。
按下「圖表」按鈕將開啟最重要物件以及從上次掃描中直接連結到它們的任何「套件」物件的摘要視圖。
如果物件是視圖(回應「子視圖」),則該物件表示為正方形。
圖形顯示需要在電腦上安裝“Graphviz/dot”。
按一下物件以查看其目前內容,如上所述。
可以對要包含的物件套用不同的篩選。
「動畫訊息」會在物件上留下痕跡,使其在收到訊息時顯示「紅色」。
圖表可以匯出為 Graphviz 或 .png 格式以供列印。
唉,目前 Swift 支援有限,因為 ivar_getTypeEncoding() 對 ivar 欄位傳回 NULL,阻止它們參與「掃描」。
Xprobe 的工作原理是在模擬器中載入一個包,該包在載入時會連接到 Xcode。應用程式透過實作以下類別來使其種子節點清單為 Xprobe 所知:
@implementation Xprobe (Seeding)
+ ( NSArray *)xprobeSeeds {
UIApplication *app = [UIApplication sharedApplication ];
NSMutableArray *seeds = [ NSMutableArray arrayWithObject: app];
[seeds addObjectsFromArray: [app windows ]];
// support for cocos2d
Class ccDirectorClass = NSClassFromString ( @" CCDirector " );
CCDirector *ccDirector = [ccDirectorClass sharedDirector ];
if ( ccDirector )
[seeds addObject: ccDirector];
return seeds;
}
@end
或對於 OSX:
+ ( NSArray *)xprobeSeeds {
NSApplication *app = [ NSApplication sharedApplication ];
NSMutableArray *seeds = [[app windows ] mutableCopy ];
if ( app. delegate )
[seeds insertObject: app.delegate atIndex: 0 ];
return seeds;
}
應用程式初始化後,呼叫 [Xprobe connectTo:"your.ip.address" keepObjects:YES] 連接到 Xcode 內執行的 TCP 伺服器。 keepObjects: 參數指定是否保留在掃描中找到的物件。這將使 Xprobe 更加可靠,但會影響應用程式中的物件生命週期。之後,呼叫 [Xprobe search:@""] 從這些物件開始執行初始掃描,尋找根物件。每次呼叫「search:」或變更物件類別篩選器時,都會重新執行掃描。該應用程式需要使用 Xprobe 和 Xtrace 建置。
在當今這個乾淨的“強”和“弱”指針時代,如果物件以某種方式對種子可見,那麼掃描似乎非常可靠。一些遺留類別的行為不佳,並使用「指派」屬性,其中可以包含指向已釋放物件的指標。為了避免清除這些類別的 ivars,Xprobe 有一個排除過濾器,可以在類別中覆寫(帶有警告):
static NSString *swiftPrefix = @" _TtC " ;
@implementation Xprobe (ExclusionOverride)
+ ( BOOL )xprobeExclude:( NSString *)className {
static NSRegularExpression *excluded;
if ( !excluded )
excluded = [ NSRegularExpression xsimpleRegexp: @" ^(_|NS|XC|IDE|DVT|Xcode3|IB|VK|WebHistory) " ];
return [excluded xmatches: className] && ![className hasPrefix: swiftPrefix];
}
@end
這些排除允許 Xprobe 在 Xcode 本身內部乾淨地工作,如果您是插件開發人員,這會很方便。如需任何建議或回饋,您可以透過 xprobe johnholdsworth.com 聯繫作者。主要版本將在 Twitter @Injection4Xcode 上發布。
使用 Swift 2.3+,Xprobe 不再能夠掃描沒有屬性的 ivars,也就是不從 NSObject 繼承的類別。
Xprobe.{h,mm} - 快照所需的核心 Xprobe 功能 IvarAccess.h - 透過名稱存取類別 ivars 所需的例程 Xprobe+Service.mm - 連接到 Xcode 的可選互動式服務
版權所有 (c) 2014-5 約翰·霍爾茲沃思。在 Objectice-C 應用程式開發過程中獲得下載、修改和任何使用許可,重新分發只能透過公共儲存庫 github 進行,但包括本版權聲明。如需使用您的應用程式進行二進位重新分發,請聯絡!
此版本包括優秀的 canviz 庫的一個非常細微的修改版本,用於在 HTML 畫布中呈現「點」文件,該畫布受 MIT 許可證的約束。這些變更是將節點的 ID 傳遞到節點標籤標記(第 212 行),反轉節點和連接它們的線的渲染(第 406 行)並儲存邊緣路徑,以便可以對它們進行著色(第 66 行和303 )在“canviz-0.1/canviz.js”中。
現在,它還包括 CodeMirror JavaScript 編輯器,用於在 MIT 許可證下使用注入來評估程式碼。
本軟體以「現況」提供,不提供任何明示或暗示的保證,包括但不限於適銷性、特定用途的適用性和不侵權的保證。 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE軟體.