M C中如何调出苹果给最近的人加速的命令

lp是打印文件的命令使用权限是所有用户。

-c:先拷贝文件再打印
-m:打印结束后发送电子邮件到用户。
-number:打印份数
-title:打印标题。
-p:设定打印的优先级别最高为100。

(1)使用lp命令打印多个文件

(2)设定打印优先级别

通过添加“-p 90”规定了打印作业的优先级为90。它将在优先级低于90的打印作业之前咑印包括没有设置优先级的作业,缺省优先级是50

在Xcode 6中有许多快捷键的设定可以使嘚你的编程工作更为高效对于在代码文件中快速导航、定位Bug以及新增应用特性都是极有效的。

当然你戳进这篇文章的目的也在于想要赽速的对代码文件进行操作,或者是让Xcode的各面板更为适应你小本子的屏幕

在Xcode 6所有快捷键中下列这些是首当其冲应当学习的。在你学习到洳何使用之后也许就再也离不开它们了。

快速浏览代码、图片以及用户界面文件

当你在对屏幕进行截图的时候可能会想要隐藏起与你感兴趣内容的无关的部分。假如你想要使用辅助编辑器或者想要设计用户界面并将其连接到代码的时候这个快捷键会相当有用。

实用工具面板主要用于编辑用户界面文件时在你只考虑写代码的时候,就可以隐藏它

4.在辅助编辑器中打开文件:在项目导航器中选中文件执行Option+咗键点击操作。

一个快速打开Assistant Editor的方式--只需要按住Option键并点击你想要在当前编辑框右边打开的文件即可

当你在敲代码的时候,突然想加个什麼功能或者想修改个什么Bug,当然最快的方法就是用查找啦无需用滚轮穿越百行代码,只需要使用查找就可以直接跳到特定的代码段。

使用项目搜索可以找到某个变量或方法名的被提到的次数可以依据实例来匹配,并可忽略大小写字母另外还可以对查找的变量名进荇替换。

跳转至当前代码文件中的代码行如果文件中有上千行代码,你可以通过该快捷操作来缩小查找范围从而在需要的地方插入代碼以添加新的功能。

喜欢使用键盘但不喜欢使用鼠标的人会大爱这个快捷方式可以直接跳转到某个方法定义或者指定的代码文件。

8.跳转欄和快速打开搜索输入快捷键

键入第一个字母即可快速切换至某个文件或者找到特定的代码行比如,在ViewController.Swift文件中按下Command + Shift + O,然后键入vDL最先展示的结果是带有

键入首字母,以较少输入搜索更多

如果你用Objective-C和C++编写程序,或者使用其他语言编写的开源代码那你可能需要查找现有嘚代码。你可以使用“Control + Command + Up Arrow”组合键操作在两个

相关的文件间快速切换比如Objective-C中的头文件和实现文件。假如你使用Swift编写代码这就有点不合适叻,因为Swift使用单一代码文件

在体验新应用之前你必须先运行它,不过有时候Xcode会不大给力不能很好地运行你的项目,这时候你就需要清除不能运行的项目

以下快捷键可帮你在代码编写过程中尽可能少地使用鼠标。

在编写代码的过程中我通常会使用该快捷键来自由运行應用程序。尽可能地测试应用程序这样你可以在早期找到并修复应用中的bug。

或许有那么一次Xcode运行出现问题或者应用无法响应,或者出現了意料之外的情况你首先会想要清除工程并再次运行它。如果这样都还不能解决问题好吧,关掉Xcode

重新打开。倘若应用程序无法运荇先看看有没有错误信息提示,你可以发挥作为“Googler”的优势来获得帮助不过这种做法不易太过频繁,它会降低程序的开发速度它将迻除所有的中间文件,而再造这些文件还要花费时间

当运行失败时清除Xcode工程

检查所写代码以确保其正常工作是你经常要做的事情,编译app笁程可让你在编写下一个特性之前确定其是否正常工作即便Xcode在代码编写后会很快进行检查,但也有所延

迟或者给出一些不恰当的错误提示。你无需总是运行应用程序假如仅仅做一些小的改变,那么编译工作可帮你做一个快速检查这样可以返回添加下一行代码。

编译玳码以确保应用程序不存在任何错误问题

在学习过程中自助学习非常重要,对于没有浏览过Xcode文档帮助的开发者来说这些快捷键可帮忙查看相关的代码参考,更好地理解苹果提供的代码从而开发出性能更健壮的app。

使用Xcode在后台安装文档并支持离线搜索查看,非常适合外絀办公打开文档和参考,并键入代码中的某个关键字Xcode文档还提供了一些额外的资源和示例工程。

内联帮助可帮开发者快速学习类或代碼片段的用法在变量、类、或者方法名上执行Option + Left-click操作来获得更多细节信息。假使你点击了弹出视图底部的参考链接那么就可以方便地跳轉到Xcode提供的文档中。你还可以在变量、类或者方法名上执行Option+双击名称操作从而更方便地跳转至文档。

编写代码时获得快速帮助

“最近偏愛Command + Shift + J快捷操作可展示当前你在工程导航器中打开的文件。我最近在大型代码库上花了不少日子这个组合键可以快速地在代码库中跳转”

“我超爱CTRL + 1,该快捷键可打开'Show Related Items‘弹出菜单’倘若你已经将光标放在了任何方法中,并点击‘CTRL + 1 ’就可以很方便地通过弹出的视图访问该

方法嘚所有调用者和被调用者我经常浏览方法的调用者从而了解如何使用该方法。”— skoll

“我经常使用本文中没有提及的一个快捷操作在文件上执行‘Command + Option + Shift + Left-click’操作,该组合键可展示一个小尺寸的弹出视图你可以查看你想要打开它的地方,比如辅助编辑器、标签或者窗口等”  — Cheezybob

伱习惯使用哪些快捷键呢?一起分享给大家吧!

在苹果的官方文档中列出了我们茬调试中能用到的一些命令我们在这重点讲一些常用的命令

需要注意的是,watchpoint是分类型的包括read,write或者read_write类型这个非常容易理解,在读寫或者读写变量或内存的时候,watchpoint是否被触发read,write或read_write跟着-w参数后面表示类型另外,命令行中watchpoint还有一些简写,set简写为swatch简写为wa,variable简写为v

哽加简单一些的例子就不说了,比如 i == 99之类的简单比较只要表达式的结果为BOOL类型即可。

可以看到上面的每种breakpoint编辑选项中基本上都有“Add Action”选項当breakpoint被触发时,都首先会执行我们设置的这些action然后我们才能得到控制权,即Xcode上面才会显示程序停止执行的UI这个Action通过例子比较好理解,我们通过上面那个setObject:forKey:的异常来说明代码如下:

第二个action,我们使用shell命令“say”让电脑发声,把一段文字读出来

第三个action,我们使用“bt”命囹来打印调用栈信息

设置完成之后当异常发生时,我们会听到电脑发声念上图中的英文然后在log中可以看到如下信息,第一行是Exception的描述信息下面是调用堆栈:

checkbox选项。当我们勾选这个checkbox之后debugger会执行breakpoint中添加的所有的actions,然后继续执行程序对于我们来说,除了触发一大堆command并且執行时间很长的情况之外程序会很快跳过这个breakpoint,所以我们可能根本不会注意到这个breakpoint的存在所以,这个选项的功能相当于在执行的最后┅个action之后直接输入continue命令继续执行。

有了这个很强大的功能我们可以直接通过breakpoints来单独对我们的程序进行修改。在某行代码时停止执行使用”expression”命令来直接修改程序的某个变量设置直接修改UI,然后继续执行expression / call 配合这个选项的时候,会非常强大可以很方便实现很多很强大嘚功能。

使用这种方式我们在不需要修改一行代码的情况下,只需要通过修改breakpoint就可以实现对UI的各种调试效果。

你是否呕心沥血的尝试詓理解代码和打印出来的变量内容

或是漏过函数调用来就简化工程行为?

亦或者是函数的伪实现

那是不是要不断的重编译,然后又开始新的轮回

构建软件是复杂的而且BUG无处不藏。一个正常的修正过程是修改代码编译,再次运行然后祈祷上帝。

似乎也不用墨守成规你可以用调试器啊!假设你已经知道怎么检视变量值,这里有更多你需要掌握的东西

这篇文章的目的是挑战你的调试知识,把你可能知道得基础知识点解析的更透彻然后向你展示了一系列有趣的栗子。开始吧!

LLDB是个开源调试器REPL特性,自带C++以及Python插件它与Xcode绑定并且驻茬控制台界面化于窗口的下端。

调试器允许你在一个特定执行时刻暂停程序检视变量值,执行自定义命令以及按你认为合适得步骤进荇程序步骤操控。(调试器主要功能戳这里)

你以前使用调试器的部分很可能仅限于Xcode的UI上打个断点但是这有些技巧,你可以做一些更酷仳的事情通过GDB与LLDB之间对比是针对所有支持的命令行的一个很好鸟瞰式的学习法,你还可能想要去安装Chisel一套开源的LLDB插件让你的调试更加囿趣。

与此同时让我们开始如何使用调试器打印变量值的旅程吧。

这里有一个简单短小的程序来打印字符串注意到断点被添加到了第仈行:

程序到此会停下来然后打开控制台,让我们能与调试器进行交互此时我们应该输入什么呢?

最简单得命令是键入help你可以获取一個命令行列表。如果你忘记一个命令或者想知道该命令更细致的使用方法那么你可以通过调用help <command>,比如help print或help thread如果你甚至忘记了命令本身,伱可以尝试使用help help但是如果你懂得足够多,你可能已经彻底不要这个命令了

打印值很容易,只要试着键入print命令:

LLDB实际上支持前缀命令判斷所以你同样可以使用prin, pri或者p。但是你不能使用pr因为LLDB不能分辨出你是否是想执行process命令。(吐槽幸好p没有歧义暴露属性)

你同时也注意箌了结果带一个$0。实际上你可以用这个来引用变量!试着键入$0 + 7然后你会看到106任何带美元符号是LLDB的命名空间,其存在是为了为你提供帮助

如果你想修改一个值?修改你说的算?好吧修改!下面来一个简单得表达式命令行:

这并不修改调试器中的值。实际上修改的是程序中的值!如果你继续程序它很神奇地会打印出42红气球(上下文)。

从现在开始注意一点我们为了方便用p与e代替print和expression。

这里有一个有意思的表达式来考虑下:p count = 18如果我们执行命令然后打印count的内容,我们会看到它确实相当于执行了表达式count = 18

这两者的区别是print命令不带参数,这點与expression不同考虑e -h +17。在选择是否要进行输入源为+17带-h标志的操作,还是选择是否要进行计算区分17和h操作在这两个选择上面是不明确的。调試器认为连字符导致了混淆你可能得不到想要的结果。

幸运的是这个解决方法十分简单。使用--来表示表示符号的结束以及输入源的开始此时如果你想要用-h标志,你可以使用e -h -- +17如果你想要进行区分,则你可以执行e -- -h +17不带标志则是十分普通,它(e --)有一个别名print

如果你键叺help print并且往下拖拽,你会看到:

当尝试打印一个更加复杂的数据结构时候会情况会更糟:

好吧我们想看下对象的description方法。我们需要告诉expression命令莋为对象来打印这个结果使用-O标志(这不是0):

很走运,e -O --也有别名其别名为po,我们可以只要这样使用:

print命令有许多种不同的格式可以甴你来指定它们以命令格式为print/<fmt>或者更简单p/<fmt>。接下来举个栗子

二进制格式(t代表tow):

你还可以使用p/c打印字符,或者是p/s打印一个非终止类型的字符串char *完整列表戳这里。

至此你可以打印对象跟简单得类型并可以在调试器中使用expression命令更改它们的值,让我们使用一些变量来减尐我们输入工作你可以声明一个变量C来表示int a = 0,同样你可以在LLDB中做同样的事情然后,变量必须以美元符号作为开头:

噢LLDB不能识别出所牽扯的变量类型。不时会遇到我们可以给一点提示:

变量特性让调试器更容易被使用,你这么认为吗

你的程序会在你打上断点的位置停下来。

此时你看到在调试工具栏有四个按钮通过使用它们你可以控制程序的执行流程:

这四个按钮从左到右依次为:继续,单步跳叺,跳出

首先,继续按钮将会让你得程序继续正常执行(可能一直运行或者遇到下一个断点)在LLDB中,你可以使用process continue来继续执行别名为c。

其次单步执行将会将单行代码当做黑盒一样执行。如果那行你调用了函数那将不会进入这个函数,而是直接执行这个函数后继续运荇LLDB中相对应的命令是thread step-over,next或者 n。

如果你想进入一个函数调用来检查调试该函数的执行你可以使用第三个按钮,跳入LLDB同样提供了thread step-in,step 囷s。注意到next与step在当前行代码不涉及函数调用的时候效果是一样的

大部分知道c,ns。但是还有第四个按钮跳出。如果你不小心跳入了一個函数而你本意是想跳过它一般反应是不断的按n知道函数返回。跳出帮你节省时间它会执行到return语句(知道执行了出栈操作),然后会停下来

来看下如下的代码片段:

代码停在断点,然后我们执行如下的命令行:

这里frame info将会告诉你当前行以及源文件是啥,可以通过键入help framehelp thread,以及help process获取更多信息那么输出什么呢?先思考之前的描述想下答案!

仍在17行的原因是finish命令会让程序运行直到isEven()函数返回然后马上停止。但是请注意17行已经执行完了。

还有一个特别帮的功能是你在调试的时候可以用thread return来控制程序流程它使用可选参数,将这个参数载入寄存器单后马上执行返回命令,然后函数出栈这意味着剩下函数没有被执行。这样因为ARC的引用计数/记录出现问题或者遗漏一些清除操莋。但在一个函数的开头执行这个命令是一个非常棒得函数打桩并且反悔了一个伪结果

让我们来对上述相同的代码段跑如下的指令:

在看答案之前乡下结果,答案如下:

我们一直都使用断点来让程序停止检视当前状态从而捕获BUG。但是如果我们转变对断点的理解我们可鉯获得更多可能。

考虑在函数刚开始处打一个断点使用thread return来重写函数行为,然后继续现在想象下自动实现这种处理。是不是听起来很牛X不是么?

Xcode提供了一套工具来创建和操作断点我们将会逐一过一遍并且进行描述与之对应的LLDB命令行。

在Xcode的左面板上有一堆按钮集合。囿一个长得很像断点点击打开断点导航栏,进去之后你一眼看到你所操作的所有断点:

(UI创建略了。是人都会吧。)

缩写可以用br。b是另外一个完全不同的命令是_regexp-break的别名,但是它足够健壮来进行创建上述命令一样效果的断点:

你也可以防止一个断点在一个符号(C语訁函数)而不用指定行数:

现在这些断点会停止正在将要执行的函数,同样适用与OC方法:

如果你想通过UI来创建象征性断点你可以点击咗下端断点导航栏的+号:

此时出现弹出框让你输入比如-[NSArray objectAtIndex:]的符号,然后程序在这个函数调用的时候便可以停止下来不管是你的代码或者还昰大苹果的代码!

如果我们看下其他选项,我们可以发现一些有意思的选项同样提供了各种条件触发的锻炼只要你点击了Xcode的UI并且选择了“Edit Breakpoint”选项:

如上图,断点只有在i为99的时候才会停止程序你可以同样设置“ ignore”选项来告诉断点在前n次调用的时候不用停止程序(条件为真)。

这里还有一个“Add Action”按钮。

可能上面断点的栗子中,你想知道每次断点时候i值是多少我们可以使用动作p i,然后当断点触发的时候峩们进入调试器它会预先执行这个命令在将控制流程交给你之前:

你也可以加多重动作,可以是调试器指令shell指令或者更健壮的打印信息:

如上你可以看到打印出i值,还有强调语句打印出自定义的表达式。

下面是上述功能用纯LLDB命令代替Xcode的UI:

如果视线停留在断点弹出框的底端你会额外看到一个选项:“Automatically continue after evaluation actions(计算动作后自动执行)。”它只是一个勾选框但是它却有强大的能力。如果你勾选上了调试器将會苹果你所有的命令然后继续执行程序。表面上看上跟断点没有打住一样(除非你断点太多了拖慢了程序进度)。

这个勾选框功能与最後一个动作断点继续执行效果一样但是有勾选框更加容易点。对应调试器的指令如下:

计算后自动继续运行让你可以单独通过使用断点來修改你的程序!你可以停止在单行运行一个expression命令来改变变量,然后继续

考虑下简陋残酷的“打印式调试”技术。不是用:

而是用断點处设置打印变量值替代吊打印日志打印语句然后继续

带动作的象征断点确实真的很强大。你也可以添加这些断点到你朋友的Xcode工程并且讓动作将所有信息细致展示出来接下来看看要耗时多久来进行计算以及会发生什么吧。

在起舞之前还有一点需要我们注意你真的可以茬调试器中执行任何的C/OC/C++/Swift命令。比较弱的是我们不能创建一个新的函数。这意味着没有新的类,块函数,带虚方法的C++类等等除了这個,调试器什么都能满足!

我们可以分配一些字节:

或者我们可以检查一些内存(使用x命令)来看我们新数组的4个字节:

我们还可以后三個字节:

当你所要的活结束的时候别忘记了释放内存避免造成内存泄露:

现在我们已经清楚基础步骤是时候来整一些比较疯狂的东西了。我过去曾写过一篇博客(大家自己收藏。)发表在looking at the internals of NSArray。当时用了大量的NSLog语句后来全用调试器搞定了。它是一个很好的调试器使用练習

畅通无阻(无断点模式)

当你的应用在跑的时候,Xcode中的调试工具栏展示一个停止按钮而非继续状态的按钮:

选中这个按钮的时候应鼡遇到断点将会停止(就像输入了process interrupt)。这时候将会让你进入调试器

这里有一个有趣的地方。如果你运行一个iOS应用你可以尝试这个(全局变量可提供)

可以看到整个层级!Chisel(上文提及)用pviews来实现。

然后通过上述的输出,我们可以看到隐藏的视图:

然后在调试器中修改它嘚背景色:

在你下次继续运行这个程序的时候你才会看到变化这因为这个变化需要传递给渲染服务然后视图展示才会被更新。

渲染服务實际上是另一个进程(称作后台)并且甚至我们调试进程被停止了,这个后台也不会被停止!

这意味着不通过继续你可以执行:

在模擬器中或者设备中的UI会进行刷新而你还在调试器中!Chisel提供了一个别名函数叫做caflush,并且它被用来实现其它捷径像hide <view>show <view>还有其他许多许多。所有嘚Chisel命令都有对应的文档所以就在安装它之后键入help来随心所欲的获取更多的信息吧。

想象一个简单的应用有一个UINavigationController作为根视图控制器你可鉯在调试器中相当简易的执行如下操作:

然后压入子视图控制器:

你会看到马上压入了一个视图控制器。

想象下你调试器中有一个变量$myButton,你想要去创建它并从UI中抓取它,或者简单地只是你想在断点停下来的时候将它作为个局部变量你可能想知道当你点击它的时候是谁接收了这个动作。这里展示达到这点有多么的简单:

想象一个假设的场景你有一个UIView且它的_layer实例变量被重写了因为这里可能不涉及方法,峩们不能使用象征性断点取而代之的是我们想观察一个内存地址什么时候被写入了。

首先我们需要找到_layer对象在那里:

现在我们知道($myView + 8)这个內存地址被写入了:

在非重写方法上的象征性断点

想象你想知道什么时候-[MyViewController viewDidAppear:]被调用了如果MyViewController实际上没有实现这个方法,但是父类实现了呢峩们可以设置一个断点来看看具体情况:

因为LLDB根据符号搜索,它找不到该方法所以你的断点将不会被触发。你所需要做的是设置一个条件[self isKindofClass:[MyViewController class]],然后见这个断点设在UIViewController上一般来说,设置一个这样的条件是有效的但是,这里无效是因为我们没有父类该方法的实现

viewDidAppear:是大苹果寫的,所以没有对应的符号;在方法内部也没有self如果你想要使用在象征性断点内使用self,你需要知道它在那里(可能在寄存器也可能在栈仩;在x86你可能在$esp+4找到它)这是个通过的历程,因为你知道已经知道有四种体系架构了吐槽略。幸运的是,Chisel已经完成了这些封装你鈳以调用bmessage:

LLDB有完整的内置Python支持。如果你在LLDB上输入脚本它会打开一个Python REPL。如果你在LLDB中键入script它会打开一个Python REPL。你可以传入一行Python语句到script命令来不進入REPL的情况下进行执行脚本:

这允许你创建各种各样的酷比命令将这个丢入文件,~/myCommands.py:

然后在LLDB中运行如下:

或者将这行代码放置于/.lldbinit让LLDB每佽运行的时候都执行一次。Chisel不过就是一堆Python脚本用来组合字符串然后告诉LLDB来执行这些字符串。听起来很简单吧!呃

我要回帖

更多关于 苹果MAC 的文章

 

随机推荐