開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的,XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%:
- 定位例外 UI 組件的記憶體地址,
- 利用記憶體地址讀取其成員變數,
定位例外UI組件記憶體地址
查看UI組件記憶體的方法還是蠻簡單的,這里簡單介紹,Xcode有提供可視化的UI查看工具:“Debug View Herarchy”,查看右側輔助欄第四個選項(鍵盤快捷鍵cmd+opt+4),
感興趣的還可以去了解Lookin、chisel、HMLLDB,不管哪一個,用起來都比那個基佬的Xcode穩定多了(陰陽怪氣),
讀取成員變數
這里提出的解決方案是利用LLDB讀取,當然二者使用上是存在差異的,
oc篇
暫停程式(cmd+ctrl+y)之后,拿到記憶體地址,然后:
// 記憶體地址為0x126708060
po ((ViewController *)(0x126708060)).ocString
// hello world
如果想讀取多個變數,可以縮寫:
// 記憶體地址為0x126708060
expr ViewController *$ocPage = (ViewController *)(0x126708060)
po $ocPage.ocString
//hello world
po $ocPage.view
//<UIView: 0x13750b930; frame = (0 0; 390 844); autoresize = W+H; backgroundColor = <UIDynamicSystemColor: 0x600001b5b080; name = systemBackgroundColor>; layer = <CALayer: 0x600000e761a0>>
如果是用chisel的話,可以用一個指令列印所有的成員變數
// 記憶體地址為0x126708060
po pinternals 0x126708060
/*
(ViewController) $7 = {
UIViewController = {
UIResponder = {
NSObject = {
isa = ViewController
}
}
_overrideTransitioningDelegate = nil
_view = 0x000000013750b930
...
_ocString = 0x0000000100eac060 @"hello world"
}
*/
swift篇
暫停程式(cmd+ctrl+y)之后,拿到記憶體地址,接下來要做的則十分重要,你需要先輸入類似于參考的指令(在這里踩坑踩到頭皮發麻):
//避免出現報錯 error: <user expression 2>:1:1: unknown type name 'let'
settings set target.language swift
//避免出現報錯 error: <EXPR>:3:43: error: cannot find 'xxxx' in scope
expr import xxxx
//樣例中則是 expr import HelloSwift
之后的和oc類似,只是語法比較貼近swift的格式:
// 記憶體地址0x125e0aae0,型別為HelloSwift.ViewController
expr let $swiftVc = unsafeBitCast(0x125e0aae0, to: HelloSwift.ViewController.self)
po $swiftVc.swiftString
//"Mr_Yu4"
總結
快速定位例外的道路上需要做的作業依然還有很多,lldb會是解決這個問題的重要工具,但是這個工具的學習曲線十分陡峭,所以平時沒事的時候,記得在lldb里面多執行這個指令:
help
/*
Debugger commands:
apropos -- List debugger commands related to a word or subject.
breakpoint -- Commands for operating on breakpoints (see 'help b' for
shorthand.)
....
*/
本文來自博客園,作者:MrYu4,轉載請注明原文鏈接:https://www.cnblogs.com/MrYU4/p/ios-congui-nei-cun-de-zhi-dao-du-qu-cheng-yuan-bia.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/550504.html
標籤:其他