Xcode变量概览-summary
问题描述
在Xcode中断点调试时,鼠标停留在变量上,就能看到变量的信息。但对于自定义对象,通常Xcode提供的直接信息非常有限,像这样
想要了解这个对象具体的内容,需要展开左边的箭头
当开发者想要知道该对象具体某个成员(很可能也是一个对象,即对象的成员的成员.....)的值时,就不得不反复展开多个箭头,平添了不少debug时的焦躁=。=
##解决方案
其实LLDB的设计者并非没有考虑到这种情况,他们设计了一种机制,允许在浮动窗口和变量窗口中显示***自定义类型对象的概览***,称之为summary。
没错,就是浮动窗口上最后一行显示的summary,我们再看一次
![](https://images0.cnblogs.com/blog/566153/201407/280717440554379.png)
Summary的原理很简单,就是保存一个"对象类型->概览"的映射表,在调试时查表进行显示。在console中输入
type summary list
可以查看当前LLDB支持的所有语言/平台的所有类型的summary,比如OC下的NSArray
type summary list NSArray
输出的结果里,可以找到
和平常使用过程中的情况一致。
LLDB支持为自定义类型添加summary。
解决示例
直观起见,这里将写一个简单的对象并为之添加summary,下面请演员入场
@interface Rectangle : NSObject
{
NSInteger _width;
NSInteger _height;
}
@property (nonatomic, assign) NSInteger width;
@property (nonatomic, assign) NSInteger height;
@end
对于这个矩形类的实例,我希望能够直接看到它的面积。
Summary可以简单地设置对象的概览为静态字符串,也可以设置为动态的如正则表达式,甚至可以设置为Python function(事实上LLDB就是使用了Python作为映射的)。
在这里,嗯。。。。。Python,就决定是你啦!
方便起见不直接在console里写入,而是把function单独放在一个文件里
def Rectangle_summary (valobj,internal_dict):
height_val = valobj.GetChildMemberWithName('_height')
width_val = valobj.GetChildMemberWithName('_width')
height = height_val.GetValueAsUnsigned(0)
width = width_val.GetValueAsUnsigned(0)
area = height*width
return 'Area: ' + str(area)
保存成summarys.py
保存起来而不是直接在console里写,将来就可以方便地添加其他自定义类型的summary,也可以将这个文件和开发组的成员共享:)
接下来导入到LLDB中
command script import /Users/XXX/Desktop/TypeSummaryTest/TypeSummaryTest/summarys.py
P.S:这个命令目测只支持full path,请允许我在这里可耻地匿了=。=
然后将导入的function指定为映射即可
type summary add Rectangle -F summarys.Rectangle_summary
这时再次查看变量,Summary已经有内容啦:)
假如有多个自定义类型的summary,都可以如法炮制。进一步地,可以让Xcode自动加载summary。首先,把加载function这步也写入脚本
import lldb
def Rectangle_summary (valobj,internal_dict):
height_val = valobj.GetChildMemberWithName('_height')
width_val = valobj.GetChildMemberWithName('_width')
height = height_val.GetValueAsUnsigned(0)
width = width_val.GetValueAsUnsigned(0)
area = height*width
return 'Area: ' + str(area)
def __lldb_init_module(debugger, dict):
debugger.HandleCommand('type summary add Rectangle -F summarys.Rectangle_summary')
然后,让Xcode在启动时自动导入这个文件。在~/下新建一个.lldbinit文件,并在其中写入command script import来导入summary文件
command script import /Users/XXX/Desktop/TypeSummaryTest/TypeSummaryTest/summarys.py
.lldbinit这个技巧来自于Facebook的chisel,是一个FB扩展的LLDB命令集
That's all for today, have fun~
参考资料
LLDB Tutorial
LLDB Data Formatters
Advanced Debugging with LLDB
LLDB Python Reference
Xcode变量概览-summary的更多相关文章
- 【转】 Xcode基本操作 -- 不错
原文网址:http://blog.csdn.net/phunxm/article/details/17044337 1.Xcode IDE概览 说明:从左到右,依次是“导航窗格(Navigator)- ...
- Xcode编辑器之基本使用(一)
前言. 苹果原生xcode使用介绍文档 1.Xcode IDE概览 说明: 从左到右,依次是“导航窗格(Navigator)->边列(Gutter)->焦点列(Ribbon)->代码 ...
- 【转】 C# 小技巧之获取变量名称
link: http://www.cnblogs.com/gongy/p/lm-2015-04-03.html 今天在自我规范程序设计的时候,变量名匹配字符串来自配置文件,网上找了一会儿发现也有朋友在 ...
- C#变量、常量、枚举、预处理器指令知多少
一.变量 C#共有其中变量类型有:静态变量.实类变量.数组元素.数值参数.引用参数.输出参数和局部变量 先定义一个简单的类来说明,如下: public class VariableDefine { p ...
- 【冷门】 C# 小技巧之获取变量名称
今天在自我规范程序设计的时候,变量名匹配字符串来自配置文件,网上找了一会儿发现也有朋友在找寻这种方式,很不容易找到一个解决方案来自http://www.th7.cn/Program/net/20140 ...
- 解析javascript变量
//add by tim//提供解析javascript 脚本的变量集合 using System;using System.Collections.Generic;using System.Linq ...
- Python之TensorFlow的变量收集、自定义命令参数、矩阵运算、梯度下降-4
一.TensorFlow为什么要存在变量收集的过程,主要目的就是把训练过程中的数据,比如loss.权重.偏置等数据通过图形展示的方式呈现在开发者的眼前. 自定义参数:自定义参数,主要是通过Python ...
- 自己动手写一个简单的MVC框架(第二版)
一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属“路由系统”,而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在这个System.W ...
- 如何使用R语言解决可恶的脏数据
转自:http://shujuren.org/article/45.html 在数据分析过程中最头疼的应该是如何应付脏数据,脏数据的存在将会对后期的建模.挖掘等工作造成严重的错误,所以必须谨慎的处理那 ...
随机推荐
- (五)hadoop系列之__集群搭建SSH无密访问多台机器
免密码ssh设置 现在确认能否不输入口令就用ssh登录localhost: $ ssh localhost 如果不输入口令就无法用ssh登陆localhost,执行下面的命令: . 并修改hosts映 ...
- 【Linux 命令】- tar 命令
语法 tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F <Sc ...
- 【EF】Entity Framework Core 命名约定
本文翻译自<Entity Framework Core: Naming Convention>,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 注意:我使用的是 Entity ...
- wp开发(三)--赚取收益篇
App开发完毕了,是否有赚取收益的想法呢?下面很浅显地介绍两种常用赚取收益的方法. 一. 收费 在发布应用时,可以对应用进行定价,发布到商城之后,用户付费才可以下载,当然也可以提供试用版.收益状况可以 ...
- 【Java】数组升序和降序
int[] x={1,6,4,8,6,9,12,32,76,34,23}; 升序: Arrays.sort(x); 降序: resort(x); public int[] resort(int[] n ...
- eclipse启动报错: No Java virtual machine
在 scala-ide下载集成scala包的eclipse版本使用,启动时报错: A java runtime environment (JRE) or java development kit (J ...
- java多线程 - 学习笔记
------------------------------------------------------------- sleep()与wait() sleep是线程类(Thread)的方法,wa ...
- OpenFlow 消息
消息类型 OpenFlow 的消息共分为三类: Controller-to-Switch 顾名思义,此类消息是由控制器主动发出 Features 用于获取交换机特性 Configuration 用于配 ...
- 测试开发linux面试之三:后台进程之操作
Hi,大家好我是Tom,继上次分享之后这次给大家带来新的知识. 进程是Linux系统中一个非常重要的概念.Linux是一个多任务的操作系统,系统上经常同时运行着多个进程.我们不关心这些进程究竟是如何分 ...
- 洛谷 P3373 【模板】线段树 2 解题报告
P3373 [模板]线段树 2 题目描述 如题,已知一个数列,你需要进行下面三种操作: 1.将某区间每一个数乘上\(x\) 2.将某区间每一个数加上\(x\) 3.求出某区间每一个数的和 输入输出格式 ...