iOS从UI内存地址到读取成员变量(oc/swift)

打印 上一主题 下一主题

主题 798|帖子 798|积分 2394

开发调试时,我们发现bug时常首先是从UI显示发现异常,下一步才会去定位UI相关连的数据的。XCode有给我们提供一系列debug工具,但是很多人可能还没有形成一套稳定的调试流程,因此本文尝试解决这个问题,顺便提出一个暴论:UI显示异常问题只需要两个步骤就能完成定位工作的80%:

  • 定位异常 UI 组件的内存地址。
  • 利用内存地址读取其成员变量。
定位异常UI组件内存地址

查看UI组件内存的方法还是蛮简单的,这里简单介绍。Xcode有提供可视化的UI查看工具:“Debug View Herarchy”,查看右侧辅助栏第四个选项(键盘快捷键cmd+opt+4)。

感兴趣的还可以去了解LookinchiselHMLLDB,不管哪一个,用起来都比那个基佬的Xcode稳定多了(阴阳怪气)。
读取成员变量

这里提出的解决方案是利用LLDB读取,当然二者使用上是存在差异的。
oc篇

暂停程序(cmd+ctrl+y)之后,拿到内存地址,然后:
  1. // 内存地址为0x126708060
  2. po ((ViewController *)(0x126708060)).ocString
  3. // hello world
复制代码
如果想读取多个变量,可以缩写:
  1. // 内存地址为0x126708060
  2. expr ViewController *$ocPage = (ViewController *)(0x126708060)
  3. po $ocPage.ocString
  4. //hello world
  5. po $ocPage.view
  6. //<UIView: 0x13750b930; frame = (0 0; 390 844); autoresize = W+H; backgroundColor = <UIDynamicSystemColor: 0x600001b5b080; name = systemBackgroundColor>; layer = <CALayer: 0x600000e761a0>>
复制代码
如果是用chisel的话,可以用一个指令打印所有的成员变量
  1. // 内存地址为0x126708060
  2. po pinternals 0x126708060
  3. /*
  4. (ViewController) $7 = {
  5.   UIViewController = {
  6.     UIResponder = {
  7.       NSObject = {
  8.         isa = ViewController
  9.       }
  10.     }
  11.     _overrideTransitioningDelegate = nil
  12.     _view = 0x000000013750b930
  13.     ...
  14.   _ocString = 0x0000000100eac060 @"hello world"
  15. }
  16. */
复制代码
swift篇

暂停程序(cmd+ctrl+y)之后,拿到内存地址,接下来要做的则十分重要,你需要先输入类似于引用的指令(在这里踩坑踩到头皮发麻):
  1. //避免出现报错 error: <user expression 2>:1:1: unknown type name 'let'
  2. settings set target.language swift
  3. //避免出现报错 error: <EXPR>:3:43: error: cannot find 'xxxx' in scope
  4. expr import xxxx
  5. //样例中则是 expr import HelloSwift
复制代码
之后的和oc类似,只是语法比较贴近swift的格式:
  1. // 内存地址0x125e0aae0,类型为HelloSwift.ViewController
  2. expr let $swiftVc = unsafeBitCast(0x125e0aae0, to: HelloSwift.ViewController.self)
  3. po $swiftVc.swiftString
  4. //"Mr_Yu4"
复制代码
总结

快速定位异常的道路上需要做的工作依然还有很多,lldb会是解决这个问题的重要工具,但是这个工具的学习曲线十分陡峭,所以平时没事的时候,记得在lldb里面多执行这个指令:
  1. help
  2. /*
  3. Debugger commands:
  4.   apropos           -- List debugger commands related to a word or subject.
  5.     breakpoint        -- Commands for operating on breakpoints (see 'help b' for
  6.                        shorthand.)
  7.   ....
  8. */
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

河曲智叟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表