開發調試時,我們發現bug時常首先是從UI顯示發現異常,下一步才會去定位UI相關連的數據的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的調試流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示異常問題只需要兩個步驟就能完成定位工作的80%: 定位異常 UI 組 ...
開發調試時,我們發現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