您的位置:首页 > 移动开发 > IOS开发

IOS调试lldb命令常用,po, Xcode控制台调试

2016-01-08 14:34 651 查看
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 =0x01446e84NSException


这些数字不重要,但是很明显的是你正在处理的NSException对象在这里。

你可以对这个对象调用任何方法。例如:
(lldb) po [$eax name]


这个将会输出这个异常的名字,在这里是NSInvalidArgumentException,并且:
(lldb) po [$eax reason]


这个将会输出错误消息:
(unsignedint) $4 =114784400Receiver() has no segue with identifier 'ModalSegue'

 注意:当你仅仅使用了“po
$eax”,这个命令将会对这个对象调用“description”方法和打印出来,在这个情况下,你也会得到错误的消息。

  
实用LLDB命令

命令名
用法 说明
exprexpr 表达式可以在调试时动态执行指定表达式,并将结果打印出来,很有用的命令。
popo 表达式与expr类似,打印对象,会调用对象description方法。是print-object的简写
printprint (type) 表达式也是打印命令,需要指定类型。
btbt [all]打印调用堆栈,是thread backtrace的简写,加all可打印所有thread的堆栈。
br lbr l是breakpoint list的简写
process continue lprocess continue简写:c
thread step-in lthread step-in l简写:s
thread step-inst lthread step-inst l简写:si
thread step-over lthread step-over l简写:n
thread step-over-inst lthread step-over-inst l简写:ni
thread step-out lthread step-out l简写:f
thread listthread 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

苹果官方的Mac
OS X Debugging Magic,详细讲述了最为一个高级苹果程序员应该具备的调试技巧http://developer.apple.com/library/mac/#technotes/tn2004/tn2124.html

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下用,发布时候,务必去掉。

网络相关:

1、tracert  windows上命令,网络跃点检测。
2、ping     大家都知道的,网络到达检测。
3、mstsc    windows上命令,远程登录使用

4、net      windeows上局域网自动登录

ForExample:net use \\192.168.1.2\ipc$ "1234" /user:"administrator"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息