问题描述

在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. 解释Spring中IOC, DI, AOP

    oc就是控制翻转或是依赖注入.通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象,而是通过spring的bean工厂为你长生这样一个对象.aop就是面向切面的编程.比如说 ...

  2. 1st 构建之法读后感

    构建之法读后感 由于时间和书的篇幅所限,所以我没能真正通读全书,只通过网上的介绍和书内前言及目录,大概了解了构建之法是一本怎样的一本书. 这本书是由具有长达20年一线软件开发经验的邹欣老师所撰写,他以 ...

  3. 【第九周】beta-review阶段贡献分分配

    组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块NEO 武志远 武志远 武志远 武志远 武志远 宫成荣 宫成荣 杨柳 宫成荣 宫成荣 李峤 杨柳 李峤 ...

  4. 【第五周】四则运算GUI

    这次这个简陋的程序终于发布了,其实发布很简单(在windows平台),因为使用的是vs2008+qt4.7的组合,在微软自家平台上用一用还是很方便的,只需要在release编译生成的exe文件,加上几 ...

  5. 【beta】Scrum站立会议第5次....11.7

    小组名称:nice! 组长:李权 成员:于淼  刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 时间:2016.11.7   12:00——12:30 地点:传媒西楼220室 本次对beta阶段的 ...

  6. PAT 甲级 1077 Kuchiguse

    https://pintia.cn/problem-sets/994805342720868352/problems/994805390896644096 The Japanese language ...

  7. UserAgent 设置 php 抓取网页

    转载:http://www.webkaka.com/tutorial/php/2013/111846/ hp抓取网页,可谓轻而易举,几行代码就可以搞定.不过,如果你有所疏忽,程序写得不够严密,就会出现 ...

  8. webgl example1

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. mysql 8 server windows 安装经验分享

    windows下安装一般分为文件/msi安装文件 本章我们说的是文件行的mysql server 安装 下载地址:https://dev.mysql.com/downloads/mysql/ 下载完后 ...

  10. vscode如何用浏览器预览运行html文件

    1,打开vscode编辑器,点击编辑器主界面左上侧第五个小图标——‘扩展’按钮: 2,进入扩展搜索右拉框,在应用商店搜索框中输入“view in browser”会自动进行搜索 3,等待几秒钟时间,扩 ...