--------------------------------------------------------------------------------
相关备忘文章:调试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下用,发布时候,务必去掉。
|