lldb调试命令
XCode4.0以后,编译器换成了LLVM 编译器 2.0
与以前相比,更加强大:
1.LLVM 编译器是下一带开源的编译技术.完全支持C, Objective-C, 和 C++.
2.LLVM 速度比 GCC快两倍,建立的程序也会运行的更快. 因为它更好的利用现代的芯片的结构.
3.LLVM和Xcode 4完全的整合在一起.包括关键字高亮,代码完整性等全都是由LLVM语法分析器来分析的. 这样可以在编辑的时候就可以很好的了解你的代码.
编译器进化之后,控制台调试命令前缀,也由原来的gdb更改成了lldb,所以当你看到控制台没有gdb而出现lldb的时候,不用惊慌,因为我们以前常用的调试命令依然可以使用:
使用前提:
1.既然是调试命令,理所当然的,程序模式应该选择Debug模式。
2.在Debug模式下,如果你的程序在运行中崩溃(Crash)掉,那么恭喜你,使用lldb调试的机会来了。
符合以上两个条件之后,控制台(即日志输出窗口All Output)会自动打出一个(lldb)命令,你在其后输入bt,回车。
恭喜你,这时Xcode会自动输出最后的一次调用堆栈。如下:
- * thread #1: tid = 0x1f03, 0x0132edee CoreFoundation`___forwarding___ + 206, stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
- frame #0: 0x0132edee CoreFoundation`___forwarding___ + 206
- frame #1: 0x0132ecb2 CoreFoundation`_CF_forwarding_prep_0 + 50
- frame #2: 0x00002e60 testMVC`-[ViewCtrl2 touchesBegan:withEvent:] + 128 at ViewCtrl2.m:40
- frame #3: 0x013c9e99 CoreFoundation`-[NSObject performSelector:withObject:withObject:] + 73
- frame #4: 0x000ffc49 UIKit`forwardTouchMethod + 268
- frame #5: 0x000ffb38 UIKit`-[UIResponder touchesBegan:withEvent:] + 30
- frame #6: 0x0003a2cf UIKit`-[UIWindow _sendTouchesForEvent:] + 272
- frame #7: 0x0003a5e6 UIKit`-[UIWindow sendEvent:] + 273
- frame #8: 0x00020dc4 UIKit`-[UIApplication sendEvent:] + 464
- frame #9: 0x00014634 UIKit`_UIApplicationHandleEvent + 8196
- frame #10: 0x012b2ef5 GraphicsServices`PurpleEventCallback + 1274
- frame #11: 0x0139c195 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
- frame #12: 0x01300ff2 CoreFoundation`__CFRunLoopDoSource1 + 146
- frame #13: 0x012ff8da CoreFoundation`__CFRunLoopRun + 2218
- frame #14: 0x012fed84 CoreFoundation`CFRunLoopRunSpecific + 212
- frame #15: 0x012fec9b CoreFoundation`CFRunLoopRunInMode + 123
- frame #16: 0x012b17d8 GraphicsServices`GSEventRunModal + 190
- frame #17: 0x012b188a GraphicsServices`GSEventRun + 103
- frame #18: 0x00012626 UIKit`UIApplicationMain + 1163
- frame #19: 0x000026fa testMVC`main + 170 at main.m:16
- frame #20: 0x00002645 testMVC`start + 53
当然还有其他的命令(和gdb命令通用):
- 命令 解释
- break NUM 在指定的行上设置断点。
- bt 显示所有的调用栈帧。该命令可用来显示函数的调用顺序。
- clear 删除设置在特定源文件、特定行上的断点。其用法为:clear FILENAME:NUM。
- continue 继续执行正在调试的程序。该命令用在程序由于处理信号或断点而导致停止运行时。
- display EXPR 每次程序停止后显示表达式的值。表达式由程序定义的变量组成。
- file FILE 装载指定的可执行文件进行调试。
- help NAME 显示指定命令的帮助信息。
- info break 显示当前断点清单,包括到达断点处的次数等。
- info files 显示被调试文件的详细信息。
- info func 显示所有的函数名称。
- info local 显示当函数中的局部变量信息。
- info prog 显示被调试程序的执行状态。
- info var 显示所有的全局和静态变量名称。
- kill 终止正被调试的程序。
- list 显示源代码段。
- make 在不退出 gdb 的情况下运行 make 工具。
- next 在不单步执行进入其他函数的情况下,向前执行一行源代码。
- print EXPR 显示表达式 EXPR 的值。
- print-object 打印一个对象
- print (int) name 打印一个类型
- print-object [artist description] 调用一个函数
- set artist = @"test" 设置变量值
- whatis 查看变理的数据类型
使用lldb调试工具,结合 解决EXC_BAD_ACCESS错误的一种方法--NSZombieEnabled一起使用,实在是查找crash的一大利器啊,很是方便!
NSZombieEnabled 只能在Debug下用,发布时候,务必去掉。
lldb命令常用(备忘)
假如你准备在模拟器里面运行这个,你可以在“(lldb)”提示的后面输入下面的:
(lldb) po $eax
LLDB在xcode4.3或者之后的版本里面是默认的调试器。假如你正在使用老一点版本的xcode的话,你又GDB调试器。他们有一些基本的相同的命令,因此假如你的xcode使用的是“(gdb)”提示,而不是“(lldb)”提示的话,你也能够更随一起做,而没有问题。
“po”命令是“print object”(打印对象)的简写。“$eax”是cup的一个寄存器。在一个异常的情况下,这个寄存器将会包含一个异常对象的指针。注意:$eax只会在模拟器里面工作,假如你在设备上调试,你将需要使用”$r0″寄存器。
例如,假如你输入:
(lldb) po [$eax class]
你将会看像这样的东西:
(id) $2 = 0x01446e84 NSException
这些数字不重要,但是很明显的是你正在处理的NSException对象在这里。
你可以对这个对象调用任何方法。例如:
(lldb) po [$eax name]
这个将会输出这个异常的名字,在这里是NSInvalidArgumentException,并且:
(lldb) po [$eax reason]
这个将会输出错误消息:
(unsigned int) $4 = 114784400 Receiver () has no segue with identifier 'ModalSegue'
注意:当你仅仅使用了“po $eax”,这个命令将会对这个对象调用“description”方法和打印出来,在这个情况下,你也会得到错误的消息。
实用LLDB命令
命令名 用法 说明
expr | expr 表达式 | 可以在调试时动态执行指定表达式,并将结果打印出来,很有用的命令。 |
po | po 表达式 | 与expr类似,打印对象,会调用对象description方法。是print-object的简写 |
print (type) 表达式 | 也是打印命令,需要指定类型。 | |
bt | bt [all] | 打印调用堆栈,是thread backtrace的简写,加all可打印所有thread的堆栈。 |
br l | br l | 是breakpoint list的简写 |
process continue l | process continue | 简写:c |
thread step-in l | thread step-in l | 简写:s |
thread step-inst l | thread step-inst l | 简写:si |
thread step-over l | thread step-over l | 简写:n |
thread step-over-inst l | thread step-over-inst l | 简写:ni |
thread step-out l | thread step-out l | 简写:f |
thread list | thread list | 简写:th l |
内存泄漏隐患提示:
Potential Leak of an object allocated on line ……
数据赋值隐患提示:
The left operand of …… is a garbage value;
对象引用隐患提示:
Reference-Counted object is used after it is released;
对retain、copy、init、release、autorelease等在计数时的使用情况的详细讲解,推荐一下:
http://www.cnblogs.com/andyque/archive/2011/08/08/2131236.html
调用autorelease这意味着,你可以在这个函数里面使用vari,但是,一旦下一次run loop被调用的时候,它就会被发送release对象。然后引用计数改为0,那么内存也就被释放掉了。(关于autorelease到底是怎么工作的,我的理解是:每一个线程都有一个autoreleasePool的栈,里面放了很多autoreleasePool对象。当你向一个对象发送autorelease消息之后,就会把该对象加到当前栈顶的autoreleasePool中去。当当前runLoop结束的时候,就会把这个pool销毁,同时对它里面的所有的autorelease对象发送release消息。而autoreleasePool是在当前runLoop开始的时候创建的,并压入栈顶。那么什么是一个runLoop呢?一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。)
当程序崩溃的时候怎么办,有如下两部分(英文版的):
http://www.raywenderlich.com/10209/my-app-crashed-now-what-part-1
(中文的part-1)http://article.ityran.com/archives/1006
http://www.raywenderlich.com/10505/my-app-crashed-now-what-part-2
(中文的part-2)http://article.ityran.com/archives/1143
内存使用详细介绍:
http://www.cocoachina.com/bbs/simple/?t94017.html
lldb调试命令的更多相关文章
- Swift 使用 LLDB 调试命令
swift 和 oc 的语法不一样: Xcode 调试技巧之 Swift 篇 打印和赋值,观察数值变量和view对象属性 p指令可打印其对象类型.内存地址以及该对象的值等具体信息, po指令则是打印其 ...
- xcode gdb/lldb调试命令
命令 解释 break NUM 在指定的行上设置断点. bt 显示所有的调用栈帧.该 ...
- iOS LLDB调试器
随着Xcode 5的发布,LLDB调试器已经取代了GDB,成为了Xcode工程中默认的调试器.它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.LLDB为Xcode提供了底层调试环 ...
- LLDB调试基本使用
在平时开发中,我们可能需要调试某些东西,比如查看给服务器发请求时传过去的参数,如果不适用LLDB的话我们用的最多的就是通过NSLog方式去打印,但现在我们可以精简这个步骤,那就是使用LLDB调试命令. ...
- iOS - 浅谈LLDB调试器
摘要 LLDB是Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用LLDB,可以让你debug事半功 ...
- lldb调试使用python脚本问题总结
lldb调试器可以使用python脚本实现功能增强,但也不是可以随心所欲的,在实际中有很多地方需要注意. 首先是对多线程环境调试使用python脚本,也要考虑python脚本有多线程安全,尤其是有许多 ...
- iOS之LLDB常用调试命令
LLDB是个开源的内置于XCode的调试工具,这里来理一理常用用法.lldb对于命令的简称,是头部匹配方式,只要不混淆,你可以随意简称某个命令.结果为在xcode下验证所得,可能与其它平台有所误差. ...
- iOS逆向工程之Hopper+LLDB调试第三方App
LLDB是Low Level Debugger的简称,在iOS开发的调试中LLDB是经常使用的,LLDB是Xcode内置的动态调试工具.使用LLDB可以动态的调试你的应用程序,如果你不做其他的额外处理 ...
- iOS LLDB调试器和断点调试
技巧一:运行时修改变量的值 你以前怎么验证是不是某个变量的值导致整段程序不能正常工作?修改代码中的变量的值,然后cmd+r重新启动app?现在你不需要这么做了,只需要设置一个断点,当程序在这进入调试模 ...
随机推荐
- 1-window搭建git
windows7搭建Git私服 作为版本控制工具大多公司会选用Git,但svn也具有一定的优势,在对开源项目管理方面,Git具有一定的优势,我们可以将自己的项目放到GitHub上面,供大家交流学习,但 ...
- iOS 消息转发以及 NSProxy 实战
最后更新: 2018-01-17 一.消息派发机制-NSObject 在 iOS 开发中, 调用对象的方法就是给对象发送一个消息.了解消息的派发机制对于iOS开发来说是一个很实用且强大的工具, 下面我 ...
- JavaScript的事件队列(Event Queue)---宏任务和微任务
前言 在写代码的时候经常思考一个问题,到底是那个函数先执行,本身JavaScript是一门单线程的语言,意思就是按照顺序执行.但是加入一些setTimeout和promise的函数来又实现了异步操作, ...
- wannafly 练习赛11 F 求子树(树上莫队+换根)
链接:https://www.nowcoder.com/acm/contest/59/F 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64b ...
- 大数据笔记(二十七)——Spark Core简介及安装配置
1.Spark Core: 类似MapReduce 核心:RDD 2.Spark SQL: 类似Hive,支持SQL 3.Spark Streaming:类似Storm =============== ...
- centos7安装nvidia驱动
1. disable UEFI security boot! 2.添加 ELRepo 源: Import the public key: rpm --import https://www.elrepo ...
- 译-使用Scroll Snapping实现CSS控制页面滚动
特别声明,本文翻译自@alligatorio的Control Page Scroll in CSS Using Scroll Snapping一文,受限于译者能力,译文或存在不足,欢迎大家指出.如需转 ...
- modern php笔记---1、新时代的php
modern php笔记---1.新时代的php 一.总结 一句话总结: php有Zend Engine 和 Facebook开发的 HipHop Virtual Machine两套引擎 1.php也 ...
- MySQL表碎片清理
MySQL大表清理 生产环境data库业务表base_data大小:500G,data_free:31G mysql> SELECT table_schema,table_name,data_f ...
- babel-node 和 nodemon
概述 今天我继续完善我做的用来 mock 前端数据的库:ym-mock. 我想要实现 2 个需求: 支持 es6,至少要能 import 吧. 修改了代码之后能自动热更新,不能我修改了服务器代码要手动 ...