日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Chisel_LLDB调试命令

發布時間:2025/7/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Chisel_LLDB调试命令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Chisel-LLDB命令插件,讓調試更Easy

LLDB 是一個有著 REPL 的特性和 C++ ,Python 插件的開源調試器。LLDB 綁定在 Xcode 內部,存在于主窗口底部的控制臺中。調試器允許你在程序運行的特定時暫停它,你可以查看變量的值,執行自定的指令,并且按照你所認為合適的步驟來操作程序的進展。(這里有一個關于調試器如何工作的總體的解釋。)

相信每個人或多或少都在用LLDB來調試,比如po一個對象。LLDB的是非常強大的,且有內建的,完整的 Python 支持。今天我們主要介紹一個 facebook 開源的 lldb 插件 Chisel。可以讓你的調試更Easy.

1.安裝Chisel

源碼地址: Chisel

Chisel 使用 homebrew 來安裝,如果你沒有安裝homebrew, 參考 homebrew。

1 2 brew update brew install chisel

安裝完成按照安裝日志上的提示,在~/.lldbinit文件中添加一行,沒有則新建。 提示類似如下:

1 2 3 ==> Caveats Add the following line to ~/.lldbinit to load chisel when Xcode launches: command script import /usr/local/opt/chisel/libexec/fblldb.py

做好上面的步驟,然后重啟Xcode就可以嘗試下了。

2.內置命令

Chisel 為lldb提供了新增的便捷命令,是非常實用的命令

2.1 pviews

這個命令可以遞歸打印所有的view,并能標示層級,相當于 UIView 的私有輔助方法 [view recursiveDescription] 。 善用使用這個功能會讓你在調試定位問題時省去很多麻煩。

使用示例:

1 2 3 4 5 6 7 8 9 (lldb) pviews view <TestView: 0x18df8070; baseClass = UIControl; frame = (144 9; 126 167); layer = <CALayer: 0x18df8150>> | <UIView: 0x18df81d0; frame = (0 0; 126 126); userInteractionEnabled = NO; layer = <CALayer: 0x18df8240>> | <UIImageView: 0x18df8330; frame = (0 0; 126 126); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x18df83b0>> | <UILabel: 0x18df8460; frame = (0 135; 126 14); text = 'haha'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x18df7fb0>> | | <_UILabelContentLayer: 0x131a3d50> (layer) | <UILabel: 0x18df8670; frame = (0 155; 126 12); text = 'hahaha'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x18df8730>> | | <_UILabelContentLayer: 0x131bea10> (layer) | <UIImageView: 0x18df88d0; frame = (0 9; 28 27); hidden = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x18df8ba0>>

2.2 pvc

這個命令也是遞歸打印層級,但是不是view,而是viewController。利用它我們可以對viewController的結構一目了然。 其實蘋果在IOS8也默默的添加了 UIViewController 的一個私有輔助方法 [UIViewController _printHierarchy] 同樣的效果。

預覽效果:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 (lldb) pvc <TabBarController: 0x13772fd0; view = <UILayoutContainerView; 0x151b3a30>; frame = (0, 0; 414, 736)> | <UINavigationController: 0x1602b800; view = <UILayoutContainerView; 0x1b00aca0>; frame = (0, 0; 414, 736)> | | <FirstViewController: 0x16029c00; view = <UIView; 0x1b01e1c0>; frame = (0, 0; 414, 736)> | <UINavigationController: 0x138c5200; view = <UILayoutContainerView; 0x1316a080>; frame = (0, 0; 414, 736)> | | <SecondViewController: 0x16030400; view = <UIView; 0x2094b370>; frame = (0, 0; 414, 736)> | | | <SecondChildViewController: 0x15af6000; view = <UIView; 0x18d4e650>; frame = (0, 64; 414, 628)> | <UINavigationController: 0x1383ca00; view = <UILayoutContainerView; 0x13180070>; frame = (0, 0; 414, 736)> | | <ThirdViewController: 0x138ddc00; view = <UIView; 0x18df6650>; frame = (0, 0; 414, 736)> | | | <ThirdChild1ViewController: 0x1393fe00; view = <UIView; 0x131ec000>; frame = (0, 0; 414, 672)> | | | <ThirdChild2ViewController: 0x138dce00; view = <UIView; 0x204075a0>; frame = (414, 0; 414, 672)> | | | <ThirdChild3ViewController: 0x138a8e00; view = <UIView; 0x20426250>; frame = (828, 0; 414, 672)> | <UINavigationController: 0x160eca00; view = <UILayoutContainerView; 0x152f7d90>; frame = (0, 0; 414, 736)> | | <FourViewController: 0x13157cc0; view not loaded>

是不是方便很多呢,而且還可以看到 viewController 是否已經 viewDidLoad .

2.3 visualize

這是個很有意思的功能,它可以讓你使用Mac的預覽打開一個 UIImage, CGImageRef, UIView, 或 CALayer。 這個功能或許可以幫我們用來截圖、用來定位一個view的具體內容。 但是在我試用了一下,發現暫時還是只能在模擬器時使用,真機還不行。

使用簡單:

1 (lldb) visualize imageView

2.4 fv & fvc

fv 和 fvc 這兩個命令是用來通過類名搜索當前內存中存在的view和viewController實例的命令,支持正則搜索。

如:

1 2 3 4 5 6 7 8 9 (lldb) fv scrollView 0x18d3b8c0 UIScrollView 0x137d0c50 UIScrollView 0x131b1580 UIScrollView 0x131b2070 UIScrollView (lldb) fvc Home 0x1393fe00 HomeFeedsViewController 0x138a8e00 HomeFeedsViewController (lldb)

2.5 show & hide

這兩個命令用來顯示和隱藏一個指定的 UIView . 你甚至不需要Continue Progress. 就可以看到效果。

2.6 mask/umask border/unborder

這兩組命令用來標識一個view或layer的位置時用, mask用來在view上覆蓋一個半透明的矩形, border可以給view添加邊框。但是在我實際使用的過程中mask總是會報錯,估計是有bug, 那么mask/unmask 一般不要用好了,用border命令是一樣的效果,反正二者的用途都是找到一個對應的view.

2.7 caflush

這個命令會重新渲染,即可以重新繪制界面, 相當于執行了 [CATransaction flush] 方法,要注意如果在動畫過程中執行這個命令,就直接渲染出動畫結束的效果。

當你想在調試界面顏色、坐標之類的時候,可以直接在控制臺修改屬性,然后caflush就可以看到效果啦,是不是要比改代碼,然后重新build省事多了呢。

例, 其中 $122 即是目標UIView:

1 2 3 4 (lldb) p view (long) $122 = 140718754142192 (lldb) e (void)[$122 setBackgroundColor:[UIColor greenColor]] (lldb) caflush

2.8 bmessage

這個命令就是用來打斷點用的了,雖然大家斷點可能都喜歡在圖形界面里面打,但是考慮一種情況:我們想在 [MyViewController viewWillAppear:] 里面打斷點,但是 MyViewController并沒有實現 viewWillAppear: 方法, 以往的作法可能就是在子類中實現下viewWillAppear:,然后打斷點,然后rebuild。

那么幸好有了 bmessage命令。我們可以不用這樣就可以打這個效果的斷點: (lldb) bmessage -[MyViewController viewWillAppear:] 上面命令會在其父類的 viewWillAppear: 方法中打斷點,并添加上了條件:[self isKindOfClass:[MyViewController class]]

3. 自定義命令

我們也可以自定義插件,不過前提是要懂一些 python。 比如設計一個打印keyWindow的windowLevel的命令:

創建python腳本文件 /magical/commands/example.py :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/usr/bin/python # Example file with custom commands, located at /magical/commands/example.py import lldb import fblldbbase as fb def lldbcommands(): return [ PrintKeyWindowLevel() ] class PrintKeyWindowLevel(fb.FBCommand): def name(self): return 'pkeywinlevel' def description(self): return 'An incredibly contrived command that prints the window level of the key window.' def run(self, arguments, options): # It's a good habit to explicitly cast the type of all return # values and arguments. LLDB can't always find them on its own. lldb.debugger.HandleCommand('p (CGFloat)[(id)[(id)[UIApplication sharedApplication] keyWindow] windowLevel]')

其中定義了PrintKeyWindowLevel的類,需要實現 name description run 方法來分別告訴名稱、描述、和執行實體。

創建好腳本后,然后在前面安裝時創建的 ~/.lldbinit文件中添加一行:

1 script fblldb.loadCommandsInDirectory('/magical/commands/')

然后重啟Xcode之后就可以使用自定義的命令啦。

參考文獻:

Chisel官方說明

與調試器共舞 – LLDB 的華爾茲

轉載于:https://www.cnblogs.com/deng37s/p/6386283.html

總結

以上是生活随笔為你收集整理的Chisel_LLDB调试命令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美国产不卡 | av午夜精品 | 国产成人一级 | 男女日皮视频 | 想要xx视频| 日韩免费黄色片 | 99免费视频 | 影音先锋黄色资源 | 修女也疯狂3免费观看完整版 | 美女福利在线视频 | 91九色中文| 免费看污黄网站在线观看 | 国产成人一区二区三区小说 | 三级视频网站 | 精品国产乱码久久久久久牛牛 | 欧美一区亚洲一区 | av最新在线 | 91福利在线导航 | av色欲无码人妻中文字幕 | 日韩av无码一区二区三区不卡 | 欧美视频免费在线观看 | 手机在线看片1024 | 国产欧美精品在线 | 污视频网站在线播放 | 精品国精品国产 | 亚洲高清免费 | 初尝黑人巨炮波多野结衣 | 揄拍成人国产精品视频 | 国产精品午夜在线 | 美女毛毛片 | 欧美一级二级在线观看 | 8050午夜一级毛片久久亚洲欧 | 东京热毛片| 日本va欧美va欧美va精品 | 亚洲 欧美 日韩 国产综合 在线 | 亚洲视频91 | 青草99| 波多野结衣毛片 | 日韩在线视频网站 | 亚洲乱码精品久久久久 | 色爱区综合 | 亚洲欧美激情另类校园 | 国产综合久久久久久鬼色 | 人人爽爽人人 | 91热久久| 亚洲国产婷婷香蕉久久久久久99 | 老熟妇高潮一区二区三区 | 精品日韩一区二区三区 | 97免费在线视频 | 少妇诱惑av | 亚洲精品福利在线观看 | 欧美做受高潮 | 18成人在线观看 | 开心激情播播 | 老司机午夜视频 | 天堂av在线中文 | 午夜探花视频 | 精品韩国一区二区三区 | 少妇裸体淫交视频免费看高清 | 亚欧洲乱码视频 | 久久国产视频一区 | 在线免费观看av网址 | 午夜伦理福利视频 | 国产成人毛毛毛片 | 在线观看成人免费 | 欧美日韩激情在线一区二区三区 | 性欧美video另类hd尤物 | jizz欧美大全| 又黄又湿的网站 | 免费黄色欧美 | 91大片在线观看 | 亚洲色欲色欲www | 天堂在线中文8 | 快色污 | 久久久久亚洲av无码麻豆 | 亚洲码在线观看 | 国产精品果冻传媒 | 欧美视频综合 | 免费一区二区在线观看 | 亚洲永久免费网站 | 日韩一区二区三区在线看 | 欧美人与性动交xxⅹxx | 国产日韩成人内射视频 | 又粗又猛又爽又黄的视频 | 秋霞影院午夜丰满少妇在线视频 | 国产精品二区视频 | 一级黄色毛毛片 | 天美麻花果冻视频大全英文版 | 久久久久麻豆 | 日韩精品网 | 久久久美女 | 国产福利在线导航 | 国产精品成人久久久 | 长篇乱肉合集乱500小说日本 | 免费成年人视频在线观看 | 青苹果av| 欧美国产成人精品一区二区三区 | 精品在线免费观看视频 | 男女激情网 |