问题描述

在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的更多相关文章

  1. 【转】 Xcode基本操作 -- 不错

    原文网址:http://blog.csdn.net/phunxm/article/details/17044337 1.Xcode IDE概览 说明:从左到右,依次是“导航窗格(Navigator)- ...

  2. Xcode编辑器之基本使用(一)

    前言. 苹果原生xcode使用介绍文档 1.Xcode IDE概览 说明: 从左到右,依次是“导航窗格(Navigator)->边列(Gutter)->焦点列(Ribbon)->代码 ...

  3. 【转】 C# 小技巧之获取变量名称

    link: http://www.cnblogs.com/gongy/p/lm-2015-04-03.html 今天在自我规范程序设计的时候,变量名匹配字符串来自配置文件,网上找了一会儿发现也有朋友在 ...

  4. C#变量、常量、枚举、预处理器指令知多少

    一.变量 C#共有其中变量类型有:静态变量.实类变量.数组元素.数值参数.引用参数.输出参数和局部变量 先定义一个简单的类来说明,如下: public class VariableDefine { p ...

  5. 【冷门】 C# 小技巧之获取变量名称

    今天在自我规范程序设计的时候,变量名匹配字符串来自配置文件,网上找了一会儿发现也有朋友在找寻这种方式,很不容易找到一个解决方案来自http://www.th7.cn/Program/net/20140 ...

  6. 解析javascript变量

    //add by tim//提供解析javascript 脚本的变量集合 using System;using System.Collections.Generic;using System.Linq ...

  7. Python之TensorFlow的变量收集、自定义命令参数、矩阵运算、梯度下降-4

    一.TensorFlow为什么要存在变量收集的过程,主要目的就是把训练过程中的数据,比如loss.权重.偏置等数据通过图形展示的方式呈现在开发者的眼前. 自定义参数:自定义参数,主要是通过Python ...

  8. 自己动手写一个简单的MVC框架(第二版)

    一.ASP.NET MVC核心机制回顾 在ASP.NET MVC中,最核心的当属“路由系统”,而路由系统的核心则源于一个强大的System.Web.Routing.dll组件. 在这个System.W ...

  9. 如何使用R语言解决可恶的脏数据

    转自:http://shujuren.org/article/45.html 在数据分析过程中最头疼的应该是如何应付脏数据,脏数据的存在将会对后期的建模.挖掘等工作造成严重的错误,所以必须谨慎的处理那 ...

随机推荐

  1. week1词频统计

    使用java完成对txt格式的英文短片进行字符提取及统计. package nenu.softWareProject; import java.io.*;import java.util.*; pub ...

  2. (十一)Jmeter另一种调试工具 HTTP Mirror Server

    之前我介绍过Jmeter的一种调试工具Debug Sampler,它可以输出Jmeter的变量.属性甚至是系统属性而不用发送真实的请求到服务器.既然这样,那么HTTP Mirror Server又是做 ...

  3. 用友 SAP 金蝶 季报

    用友 2018Q3季报 营收:.42亿 营收收入同比增长:42.36% 净利润:.35万 净利润同比增长率:113.83% 销售毛利率:66.88% 销售净利率:19.29% 用友2017财年年报 营 ...

  4. PHP中类中成员及常量

    类中成员概述 面向对象编程,是需要通过“对象”去做什么事情(以完成某种任务): 而: 对象总是来源于类: 所以: 面向对象的编程,一切都是从定义类开始: 类中成员分为3大类: 属性: 方法: 常量: ...

  5. socket与TCP/UDP编程~

    ket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. ...

  6. 网页移动到一个高度后加载网页元素【getBoundingClientRect好用】

    $(window).scroll(function () { var windowH = $(window).height();//取可视窗口的高度 ).getBoundingClientRect() ...

  7. HDU4466_Triangle

    今天比赛做的一个题目,不过今天终于感受到了复旦题目有多坑了. 题目的意思是给你一段长为n个单位长度的直线,你可以选择任意连续单位长度的线段组成三角形,可以组成任意你可以组成任意多个三角形,且要求其中所 ...

  8. bzoj5090[lydsy11月赛]组题

    裸的01分数规划,二分答案,没了. #include<cstdio> #include<algorithm> using namespace std; const int ma ...

  9. [TJOI2015]线性代数 网络流

    题面 题面 题解 先化一波式子: \[D = (A \cdot B - C)A^T \] \[ = \sum_{i = 1}^{n}H_{1i}\cdot A^T_{i1}\] \[H_{1i} = ...

  10. NOIP模拟

    1.要选一个{1,2,...n}的子集使得假如a和b在所选集合里且(a+b)/2∈{1,2,...n}那么(a+b)/2也在所选集合里 f[i]=2*f[i-1]-f[i-2]+g[i] g[n]:选 ...