LLDB 调试工具Chisel兼容Xcode11

2020年9月更新:
由于Chisel官方已更新,可以使用官方的更新来解决问题了:

brew upgrade chisel

以下是2019原文:
Chisel是Facebook出品的(一个灰常强大的)LLDB命令的集合,用于帮助调试iOS应用程序

在Xcode11上,Chisel初始化时会报错:

error: module importing failed: Missing parentheses in call to 'print'. Did you mean print('Whoops! You are missing the <' + arg.argName + '> argument.')? (fblldb.py, line 98)
  File "temp.py", line 1, in <module>
  File "/Applications/Xcode.app/Contents/Developer/Library/Frameworks/Python3.framework/Versions/3.7/lib/python3.7/importlib/__init__.py", line 169, in reload
    _bootstrap._exec(spec, module)
  File "<frozen importlib._bootstrap>", line 630, in _exec
  File "<frozen importlib._bootstrap_external>", line 724, in exec_module
  File "<frozen importlib._bootstrap_external>", line 860, in get_code
  File "<frozen importlib._bootstrap_external>", line 791, in source_to_code
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed

这是由于最新的lldb基于Python3,从错误日志可以看到加载的是Xcode.app内置的python3.7

根据Xcode 11 Beta发行说明

LLDB的Python脚本现在基于Python3。如果您使用的是与Python 3不兼容的Python扩展,它们将会中断。为了帮助过渡,您可以通过设置默认值以Python 2模式运行:

默认设置为com.apple.dt.lldb DefaultPythonVersion 2
将来将删除对Python 2的支持。(47806994)

解决办法1:
让lldb使用python2(不推荐,毕竟用新不用旧):
打开终端,输入:

defaults write com.apple.dt.lldb DefaultPythonVersion 2

解决办法2:
修改源码使其兼容Python3,这里有个小哥已经兼容了Python3,可以用脚本快速拷贝到

#注意,我是用brew安装的(brew install chisel),所以chisel所在的路径是/usr/local/Cellar/chisel/1.8.1,如果你的此路径下面没文件,请改成你自己chisel所在的路径
cd ~/Downloads && git clone https://github.com/chenjiangchuan/chisel.git && cd chisel &&cp -f -R -v libexec /usr/local/Cellar/chisel/1.8.1

安装过程忽略,常见用法(更多请去官方GitHub查看)

Command 作用(描述) iOS OS X
pviews 打印key window的递归视图描述 Yes Yes
pvc 打印key window的递归视图控制器描述 Yes No
visualize 在Mac上的预览App中打开UIImage,CGImageRef等图像
fv 在层次结构中查找其类名与提供的正则表达式匹配的视图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThi...
    paraneaeee阅读 1,214评论 0 7
  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThi...
    木易林1阅读 967评论 0 4
  • 相信大家肯定都有过为了调试而添加打印变量,或者使用直接常量代替函数调用结果,或者更改判断条件以进入某特定分支的调试...
    纵横而乐阅读 2,002评论 0 3
  • 你是否曾经苦恼于理解你的代码,而去尝试打印一个变量的值? NSLog(@"%@", whatIsInsideThi...
    我是啊梁阅读 822评论 1 1
  • 与调试器共舞 - LLDB 的华尔兹 nangege 2014/12/19 你是否曾经苦恼于理解你的代码,而去尝试...
    McDan阅读 887评论 0 0