美文网首页常用方法iOS 程序员程序员
Xcode开发常用的断点调试命令?

Xcode开发常用的断点调试命令?

作者: 随心吧 | 来源:发表于2017-03-31 18:19 被阅读132次
『导言』

iOS利用Xcode进行Debug调试的技巧很多,比如最常见的方式是打印Log,在一些工程中处处可见NSLog。还有就是打断点Debug方式等。诸如此类,下面就自己在开发过程中常用的Xcode调试技巧简单的做个总结。(断点调试demo下载
声明: 此文仅为我个人理解,有不正确的地方请提出宝贵的意见建议!谢谢!

一、Xcode调试技巧之:NSLog

在OC语言中,打Log是采用NSLog方法。但是NSLog效率低下,可以打印出具体位置方法:(调试输出Debug.h文档下载


#ifdef DEBUG
#define DLog(fmt, ...) NSLog((@"[文件名:%s]\n" "[函数名:%s]\n" "[行号:%d] \n" fmt), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#define DeBugLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#define NSLog(...) NSLog(__VA_ARGS__);
#define MyNSLog(FORMAT, ...) fprintf(stderr,"[%s]:[line %d行] %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);
#else
#define DLog(...)
#define DeBugLog(...)
#define NSLog(...)
#define MyNSLog(FORMAT, ...)
#endif
  • 注意:release版本中应该要去掉NSLog
  • 例如:
  • 代码
    NSArray *array = @[@"wo",@"shi",@"apple"];
    DLog(@"打印数组%@",array);
  • 打印结果(类名+方法+行号+打印内容
2017-03-31 17:08:23.730 控制台调试[20594:350839] [文件名:/Users/zhaowenjuan/Desktop/ÊéßÂà∂Âè∞Ë∞ÉËØï/ÊéßÂà∂Âè∞Ë∞ÉËØï/ViewController.m]
[函数名:-[ViewController touchesBegan:withEvent:]]
[行号:43] 
打印数组(
    wo,
    shi,
    apple
)
图.DLog输出逻辑分析
二、Xcode调试技巧之:LLDB
  • 断点调试执行命令:
序号 命令 说明 翻译 范围
1 c/continue goto next breakpoint; 去执行下一个断点 断点
2 n/next step over 跳到某个断点方法内部 断点
3 s/step step into 跳到某个断点内部的下一个位置 断点
4 finish step out 退出某个断点内部的位置 断点
  • 断点执行命令示例图:


    断点执行图标.gif
    断点执行.gif
  • 断点调试打印命令
序号 命令 说明 举例子
1 po print object的缩写,表示显示对象的文本描述,如果对象不存在则打印nil 命令:po num</br>输出 :8
2 p 打印基本数据类型 命令:p i</br>输出:(int) $0 = 30
3 call 执行一段代码</br>一般只在不需要显式输出,或是无返回值时使用call,用于动态调试插入调用代码 命令:call NSLog(@"%@", @"zwj")
4 expr 动态执行指定表达式 命令:expr i = 101</br>输出:(int)$0 = 101
5 bt 打印当前线程堆栈信息;<br /><br />如果要打印所有线程堆栈信息,使用:bt all即可。 \
6 image 常用来寻找栈地址对应代码位置:行号 例如:<br />NSArray *array = @[@"yang",@"she",@"bing"];NSLog(@"%@",array[3]);</br><br />命令输入:<br />image lookup --address 0x0000000104c25550 </br><br />输出:<br />Address: 控制台调试[0x000000010000145a] (控制台调试.__TEXT.__text + 1178) </br>Summary: 控制台调试</br>-[ViewController touchesBegan:withEvent:] + 1178 at ViewController.m:43 </br><br /> 重点代码:<br />image lookup --address
断点输出命令-OK.gif
  • 补充:命令image
    • 问题:命令image,如何来寻找栈地址对应代码具体位置?(根据地址找到类中的位置,如行标line
  • 例如: 应用场景(数组越界)模拟代码:
NSArray *array = @[@"yang",@"she",@"bing"];
NSLog(@"%@",array[3]);

错误信息如下:

2017-03-31 18:17:24.200 控制台调试[21406:433320] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 3 beyond bounds [0 .. 2]'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010f86ed4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010f2d021e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010f7a92bb -[__NSArrayI objectAtIndex:] + 155
    3   控制台调试                     0x000000010ecfb44a -[ViewController touchesBegan:withEvent:] + 1178
    4   UIKit                               0x000000010fea9f6b forwardTouchMethod + 348
    5   UIKit                               0x000000010fea9dfe -[UIResponder touchesBegan:withEvent:] + 49
    6   UIKit                               0x000000010fd02285 -[UIWindow _sendTouchesForEvent:] + 2043
    7   UIKit                               0x000000010fd03c33 -[UIWindow sendEvent:] + 4011
    8   UIKit                               0x000000010fcb09ab -[UIApplication sendEvent:] + 371
    9   UIKit                               0x000000011049d72d __dispatchPreprocessedEventFromEventQueue + 3248
    10  UIKit                               0x0000000110496463 __handleEventQueue + 4879
    11  CoreFoundation                      0x000000010f813761 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    12  CoreFoundation                      0x000000010f7f898c __CFRunLoopDoSources0 + 556
    13  CoreFoundation                      0x000000010f7f7e76 __CFRunLoopRun + 918
    14  CoreFoundation                      0x000000010f7f7884 CFRunLoopRunSpecific + 420
    15  GraphicsServices                    0x000000011365aa6f GSEventRunModal + 161
    16  UIKit                               0x000000010fc92c68 UIApplicationMain + 159
    17  控制台调试                     0x000000010ecfb83f main + 111
    18  libdyld.dylib                       0x00000001126d068d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

这个时候我们如果怀疑出错的地址是0x000000010ecfb44a,那么我们可以使用下面命令来找出错误代码的位置:

image lookup --address 0x000000010ecfb44a

执行命令后输出结果如下:

(lldb) image lookup --address 0x000000010ecfb44a
      Address: 控制台调试[0x000000010000144a] (控制台调试.__TEXT.__text + 1178)
      Summary: 控制台调试`-[ViewController touchesBegan:withEvent:] + 1178 at ViewController.m:43
断点输出命令-崩溃.gif
  • 结果分析:从上面输出结果中可以看出,错误位置应该是ViewController.m文件中的第43行。
  • 链接:

1 .iOS开发之Xcode常用调试技巧总结

相关文章

  • Xcode控制台调试常用命令

    IOS Xcode调试常用命令和断点 Xcode 中的调试技巧与我们的日常开发息息相关,而这些调试技巧在我们解决B...

  • iOS开发中常见错误

    iOS开发中遇到的常见错误,未完善后期修改整理完善! 苹果官方Xcode帮助IOS Xcode调试常用命令和断点整...

  • Xcode开发常用的断点调试命令?

    『导言』 iOS利用Xcode进行Debug调试的技巧很多,比如最常见的方式是打印Log,在一些工程中处处可见NS...

  • 知识点-LLDB调试命令

    lldb是我们平时在打断点时候,打印面板出现的。 lldb是Xcode自带的调试工具,下面是常用的lldb调试命令...

  • iOS开发之Xcode常用调试技巧总结

    iOS开发之Xcode常用调试技巧总结 iOS开发之Xcode常用调试技巧总结

  • LLDB命令

    lldb是我们平时在打断点时候,打印版出现的,它是Xcode自带的调试工具,下面是常用的lldb调试命令。 1、p...

  • Xcode调试断点无效

      Xcode是iOS必不可少的开发工具,断点调试更是我们调试代码的最常用手段,但是现在最新版本的Xcode会时不...

  • Xcode调试命令行工具 - lldb

    LLDB是XCode内置的为我们开发者提供的调试工具,可以在设置断点的时候在控制台中输入相关的lldb命令进行调试...

  • 2020-11-16

    iOS开发之Xcode控制台调试常用命令 1. p 命令 p 命令是 print 命令的简写,使用p 命令可以查看...

  • iOS - NSLog打印(精准打印)

    常用的NSLog的语句 在iOS开发过程中,调试是很重要的过程,而除了各种断点调试(普通断点、条件断点、全局断点)...

网友评论

本文标题:Xcode开发常用的断点调试命令?

本文链接:https://www.haomeiwen.com/subject/addvottx.html