xcode7添加第三方框架怎么显示83.5的框

4192人阅读
原文://cocoalumberjack_xcodecolors/#.UtdOi3l75q0
前几天在的微信公共账号(iosDevTips)里,收到一条关于如何在开发的时候,在控制台中更友好地输出Log的消息。里面大致提到了三个方案
用Emoji放到每行行首,作为区分。(From&&tang sheng gang,第三个字我去查了:D)基于的开源方案AppCode,有插件可以设置Log着色(From 黎伟)
我只用过第二种,而且用起来也挺方便。关于什么是CocoaLumberjack,有什么优点,我这里就不再累述了,反正谁用谁知道,想了解的直接去Github上看吧。因为看到许多朋友说尝试后都失败了,这里说说我的设置步骤。
首先我的项目(ProjectA)是用Cocoapods管理的(当然你可以直接把CocoaLumberjack所有的文件拖到自己的项目里,如果你不觉得这么做很麻烦的话),所以在podfile里面添加pod 'CocoaLumberjack',然后pod update就可以了。
因为CocoaLumberjack的Color Log是依赖插件的,因此我们也必需安装这个插件。装完后重新启动一下Xcode,然后先试试XcodeColors的Demo Project,确定插件已经成功安装。
接下来在ProjectA里(可以是applicationDidFinishLaunchingWithOptions)设置一下日志的输出级别(可以按照级别输出,只输出警告,错误,或者全部),对lumberjack进行初始化,并且打开Color Log的开关
static const int ddLogLevel = LOG_LEVEL_VERBOSE;
// Standard lumberjack initialization
[DDLog addLogger:[DDTTYLogger sharedInstance]];
// And we also enable colors
[[DDTTYLogger sharedInstance] setColorsEnabled:YES];
这样的话你就可以用DDLogInfo,DDLogError等取代之前的NSLog了。默认的话DDLogError输出是红色的,DDLogWarn是黄色的(我喜欢这个颜色:D)。
到目前为止,对于我来说至少是在模拟器上调试的时候输出的Log都带颜色了,但后来我发现在真机上调试的时候输出的还是黑色的Log。后来在Wiki的上发现了这么一条
You may occasionally notice that colors don't work when you're debugging your app in the simulator. And you may also notice that you colors never work when debugging on the actual device. How do I fix it so it works everywhere, all the time?
我运气可能算比较好,每次在模拟器上调试的时候都正常有颜色输出。按照提示我对Project的Scheme作了如下调整:
In Xcode bring up the Scheme Editor (Product -& Edit Scheme...)Select &Run& (on the left), and then the &Arguments& tabAdd a new Environment Variable named &XcodeColors&, with a value of &YES&
最后重新Cmd+R一次,搞定,我在Xcode4.4和Xcode4.6上都做过测试,都是可以的。所以在我这里目前不存在Xcode版本不一致而造成彩色日志输出失败的问题。如果有朋友按照如上的步骤设置还是不成功,欢迎在评论里留言提出疑问,一起讨论。
最后附上真相
今天微博上有位叫的朋友提到了,感兴趣的朋友可以翻过去看一下,你应该不会后悔。
因为XCode5下对插件安装多了一层验证,因此升级XCode5之后造成插件失灵的话,请移步
不出颜色的解决办法原文:/articles/NJNBze
前段时间,组里讨论更好的调试方式,其中提到希望很好区分不同的log,就是针对console中不同的Log语句加入特定的元素来区分。rcio提出在不同的Log中加入表情图片来区分,实验效果还可以。dezhi提到了&&这个插件,可以对Log语句标记不同的颜色。
我按照XcodeColors installation instructions教程安装了插件(即将XcodeColors.xcplugin放到 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/ 目录下,假如没有该目录则自己创建,别忘了重启Xxode),下载并运行了源码中提供的TestXcodeColors,一切正常!然后雄心勃勃想在我们自己的代码中使用,却发现没有效果,google了很多的方法都不行。最终终于找到了问题的所在:
#define XCODE_COLORS_ESCAPE_MAC @&\033[&
#define XCODE_COLORS_ESCAPE_IOS @&\xC2\xA0[&
#if TARGET_OS_IPHONE
#define XCODE_COLORS_ESCAPE XCODE_COLORS_ESCAPE_IOS
#define XCODE_COLORS_ESCAPE XCODE_COLORS_ESCAPE_MAC
TestXcodeColors的Target是Mac OSX应用程序,所以没有问题;而我们的项目是iOS项目,宏定义为:#define XCODE_COLORS_ESCAPE XCODE_COLORS_ESCAPE_IOS,但实际上我们的console是在xcode上运行的,所以应该采用XCODE_COLORS_ESCAPE_MAC的前缀才能显示。
因此,将上段代码修改为:
#define XCODE_COLORS_ESCAPE_MAC @&\033[&
#define XCODE_COLORS_ESCAPE_IOS @&\xC2\xA0[&
#define XCODE_COLORS_ESCAPE XCODE_COLORS_ESCAPE_IOS
#define XCODE_COLORS_ESCAPE XCODE_COLORS_ESCAPE_MAC
然后将TestXcodeColors中示例的NSLog代码拷贝到iOS测试项目中,Bingo:
测试 XcodeColors 插件可用
上图项目是使用Xcode 5 预览版创建编译运行的,所以使用Xcode 4的方法设置 XcodeColors 插件在Xcode 5上也是可用的。
指引上说XcodeColors可以通过以下方式获取插件是否安装成功并且可以用:&
char *xcode_colors = getenv(XCODE_COLORS);
if (xcode_colors && (strcmp(xcode_colors, &YES&) == 0))
// XcodeColors is installed and enabled!
实测发现只对Mac OSX应用有效,而iOS应用是无法检测成功的,猜测又是跟TARGET_OS_IPHONE相关。该问题会继续跟进,希望懂的朋友可以不吝指点。&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:552925次
积分:6010
积分:6010
排名:第2735名
原创:63篇
转载:140篇
评论:87条
(1)(1)(1)(1)(1)(1)(3)(6)(4)(10)(7)(6)(10)(5)(5)(8)(3)(2)(1)(1)(2)(10)(9)(23)(6)(9)(6)(7)(12)(4)(8)(7)(1)(5)(14)(3)二次元同好交流新大陆
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
观乎其上,得乎其中,
观乎其中,得乎其下。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
Xcode从默认使用LLDB后,有很多实用的调试技巧,这里简单介绍一下。输出被调用的方法/函数1NSLog(@"%s", __PRETTY_FUNCTION__);监测任意的异常Add ALL EXCEPTION breakpointobjc_exception_throw(Add Symbolic Exception)为任意方法添加断点以UIView的setFrame方法为例:启动App,挂上Debugger,在任意时刻暂停App,在lldb中输入1(lldb) breakpoint set -n "-[UIView setFrame:]"Sound Breakpoint添加断点,设置action为sound,然后勾选Automatically continue after evaluating。可以简单地用以确认某些方法是否被调用了。输出所有线程的backtrace命中断点后,在lldb中输入:1(lldb) bt all输出View结构任意时刻暂停App,在lldb中输入:1(lldb) po [[[[UIApplication sharedApplication] delegate] window] recursiveDescription]输出NSDataDebugger中,选中NSData-&View Memory,会看到一些无法阅读的数据;在lldb中,输入:1(lldb) po yourDataObject会得到yourDataObject的地址,用该地址替换掉Memory Viewer中的地址,会自动使用合适的encoding。Instruments Flags这在调试多线程应用时格外有用,因为很难保证固定的执行顺序。使用这个特性,需要添加DTPerfomanceSession.framework到Xcode project中。下面的代码片段,将在使用Instruments时,添加一个flag:123#import &DTPerformanceSession/DTSignalFlag.h& // ...DTSendSignalFlag("com.invasivecode.mytracepoints.app.point", DT_POINT_SIGNAL, TRUE);你也可以在Instruments中显示开始和结束标志:123456789#import &DTPerformanceSession/DTSignalFlag.h& // ...// Put this line at the begginingDTSendSignalFlag("com.invasivecode.mytracepoints.app.start", DT_START_SIGNAL, TRUE);// ... more code here// put this at the endDTSendSignalFlag("com.invasivecode.mytracepoints.app.end", DT_END_SIGNAL, TRUE);Reference:Presentation by&&at CocoaHeads技巧一:运行时修改变量的值你以前怎么验证是不是某个变量的值导致整段程序不能正常工作?修改代码中的变量的值,然后cmd+r重新启动app?现在你不需要这么做了,只需要设置一个断点,当程序在这进入调试模式后,使用&expr&命令即可在运行时修改变量的值。假如有一个loginWithUsername:方法,需要两个参数:username,password。首先设置好断点,如下图所示:运行app,进入断点模式后,在(lldb)后输入12expr username = @&"username"expr password = @&"badpassword"控制台会返回以下信息12(NSString *) $0 = 0x3d3504c4 @&"username"(NSString *) $1 = 0x1d18ef60 @&"badpassword"现在跳出断点,执行断点之后的两条输出语句,控制台会有以下输出12(0x1c59aae0) A line&for&the breakpoint(0x1c59aae0) Username and Password after: username:badpassword看到看吧,我们在运行时修改了变量的值,事情还可以变的更简单一些,我们可以编辑断点,让它自动填充需要的修改的变量的值,并且可以选择在此断点处不进入断点模式,仅仅修改指定变量的值,然后自动执行后续代码。右击断点选择“Edit Breakpoint...”(或者按住cmd+option,单击断点),然后如下图所示设置断点注意选中了最后一行(“Automatically continue after evaluating”)的选择框,这就保证运行到这个断点的时,填充变量的值,然后继续运行,并不在此处断点进入调试模式。运行app,你会得到和上述手动设置变量的值一样的输出。接下来单击断点,使其处于禁用状态,现在箭头的颜色应该是浅蓝色的,重新运行app,你会发现username和password的值没有在运行时被改变了。技巧二:设置断点触发条件断点的另外一个重要作用,是可以设置触发断点生效的条件,这样我们就可以在运行时针对特定的数据进行分析,观察app是否运行在正确的轨道上。如下图:上述截图可以看到如下语句1(&BOOL&)[(NSString*)[item valueForKey:@&"ID"&] isEqualToString:@&"93306"&]通过这行语句,我们告诉编译器:当item中ID等于93306时,此断点生效,进入断点调试模式。技巧三:格式化输出数据如果你厌倦了代码里无穷无尽的NSLog,幸运的是我们可以在编辑断点使其输出格式化字符串就像平常编码时一样。不过有一点需要注意,平常编码时可能会使用NSString‘s&stringWithFormat:输出格式化字符串,不过这个方法貌似在断点中木有效果,你需要使用alloc/init形式的方法,如下:1po [[NSString alloc] initWithFormat:@&"Item index is: %d"&, index]运行app,就能在控制台看到想要的输出啦!简单!强大!这就是LLDB给你的选择,从此代码里可以不用再有NSLog满天飞的情况了,代码变得更干净了,心情变得更愉悦了!LLDB还有很多强大的地方,本教程只不过揭开了它的面纱,即便如此,仍让我们沉醉不已。你可能从未使用过LLDB,那让我们先来热热身。 在调试器中最常用到的命令是&p(用于输出基本类型)或者&po&(用于输出 Objective-C 对象)。如下,你可以通过输入po 和 view 来输出 view 的信息:po [self view]
随后调试器会输出这个 object 的 description。在这个例子中可能是这样的信息:(UIView *) $1 = 0x &UITableView: 0x824c800; frame = (0 20; 768 1004); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = &NSArray: 0x74c3010&; layer = &CALayer: 0x74c2710&; contentOffset: {0, 0}&
什么?在什么地方可以输入这个命令?OK,首先,我们需要先设置一个断点。如下图所示,我在&viewDidLoad:&中设置了一个了一个断点:接下来运行程序,然后程序会停留在断点处,从下图你可以看到在什么地方输入LLDB命令:你可能需要的是 view 下 subview 的数量。由于 subview 的数量是一个 int 类型的值,所以我们使用命令&p&:p (int)[[[self view] subviews] count]
最后你看到的输出会是:(int) $2 = 2
是不是很简单?细心的朋友可能会发现输出的信息中带有&$1&、&$2&的字样。实际上,我们每次查询的结果会保存在一些持续变量中($[0-9]+),这样你可以在后面的查询中直接使用这些值。比如现在我接下来要重新取回&$1&的值:(lldb) po $1
(UIView *) $1 = 0x &UITableView: 0x824c800; frame = (0 20; 768 1004); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = &NSArray: 0x74c3010&; layer = &CALayer: 0x74c2710&; contentOffset: {0, 0}&
可以看到,我们依然可以取到之前[self view]的值。LLDB命令还可以用在断点上,详细的使用可以参见&常用命令下面补充说明其它一些常用的命令:expr可以在调试时动态执行指定表达式,并将结果打印出来。常用于在调试过程中修改变量的值。如图设置断点,然后运行程序。程序中断后输入下面的命令:expr a=2
你会看到如下的输出:(int) $0 = 2
继续运行程序,程序输出的信息是:实际值:2
很明显可以看出,变量a的值被改变。 除此之外,还可以使用这个命令新声明一个变量对象,如:expr int $b=2
下面的命令用于输出新声明对象的值。(注意,对象名前要加$)callcall即是调用的意思。其实上述的po和p也有调用的功能。因此一般只在不需要显示输出,或是方法无返回值时使用call。 和上面的命令一样,我们依然在viewDidLoad:&里面设置断点,然后在程序中断的时候输入下面的命令:call [self.view setBackgroundColor:[UIColor redColor]]
继续运行程序,看看view的背景颜色是不是变成红色的了!在调试的时候灵活运用call命令可以起到事半功倍的作用。bt打印调用堆栈,加all可打印所有thread的堆栈。不详细举例说明,感兴趣的朋友可以自己试试。imageimage 命令可用于寻址,有多个组合命令。比较实用的用法是用于寻找栈地址对应的代码位置。 下面我写了一段代码NSArray *arr=[[NSArray alloc] initWithObjects:@"1",@"2", nil];
NSLog(@"%@",arr[2]);
这段代码有明显的错误,程序运行这段代码后会抛出下面的异常:[objc]&&&&&&***&Terminating&app&due&to&uncaught&exception&&'NSRangeException',&&reason:&'***&-[__NSArrayI&objectAtIndex:]:&index&2&beyond&bounds&[0&..&1]'&&***&First&&throw&call&&stack:&&(&&&&&0&&&CoreFoundation&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&1&9&5&1&4&95&__exceptionPreprocess&+&&1&6&5&&&&&1&&&libobjc&.A&.dylib&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&1&6b&0&99e&objc_exception_throw&+&&4&3&&&&&2&&&CoreFoundation&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&1&9&0&9e&3f&-[__NSArrayI&objectAtIndex:]&+&&1&7&5&&&&&3&&&ControlStyleDemo&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&0&0&4af&8&-[RootViewController&&viewDidLoad]&+&&3&1&2&&&&&4&&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&3&5&3&5&9e&-[UIViewController&loadViewIfRequired]&+&&5&6&2&&&&&5&&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&3&5&3&7&7&7&-[UIViewController&view]&+&&2&9&&&&&6&&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&2&9&3&9&6b&-[UIWindow&addRootViewControllerViewIfPossible]&+&&5&8&&&&&7&&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&2&9&3c&7&0&-[UIWindow&_setHidden:forced:]&+&&2&8&2&&&&&8&&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&2&9cffa&-[UIWindow&makeKeyAndVisible]&+&&5&1&&&&&9&&&ControlStyleDemo&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&0&0&4&5e&0&-[AppDelegate&&application:didFinishLaunchingWithOptions:]&+&&6&7&2&&&&&1&0&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&2&5&8&3d&9&-[UIApplication&_handleDelegateCallbacksWithOptions:isSuspended:restoreState:]&+&&2&6&4&&&&&1&1&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&2&5&8be&1&-[UIApplication&_callInitializationDelegatesForURL:payload:suspended:]&+&&1&6&0&5&&&&&1&2&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&2&5ca&0c&-[UIApplication&_runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:]&+&&6&60&&&&&1&3&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&2&6dd&4c&-[UIApplication&handleEvent:withNewEvent:]&+&&3&1&8&9&&&&&1&4&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&2&6e&2&1&6&-[UIApplication&sendEvent:]&+&&7&9&&&&&1&5&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&2&5e&0&86&_UIApplicationHandleEvent&+&&5&7&8&&&&&1&6&&GraphicsServices&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&3aca&71a&_PurpleEventCallback&+&&7&6&2&&&&&1&7&&GraphicsServices&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&3aca&1e1&PurpleEventCallback&+&&3&5&&&&&1&8&&CoreFoundation&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&1&8d&3&6&79&__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__&+&&4&1&&&&&1&9&&CoreFoundation&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&1&8d&3&44e&__CFRunLoopDoSource&1&+&&4&7&8&&&&&2&0&&CoreFoundation&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&1&8fc&9&03&__CFRunLoopRun&+&&1&9&3&9&&&&&2&1&&CoreFoundation&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&1&8fbd&83&CFRunLoopRunSpecific&+&&4&6&7&&&&&2&2&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&2&5c&2e&1&-[UIApplication&_run]&+&&6&0&9&&&&&2&3&&UIKit&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&2&5de&33&UIApplicationMain&+&&1&0&1&0&&&&&2&4&&ControlStyleDemo&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&0&0&0&6b&7&3&main&+&&11&5&&&&&2&5&&libdyld&.dylib&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&1&0&1fe&9&5fd&start&+&&1&&&&&2&6&&???&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&0x&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&1&&0x&0&+&&1&&)&&libc++abi&.dylib:&terminating&with&uncaught&exception&of&type&NSException&&现在,我们怀疑出错的地址是0x4af8(可以根据执行文件名判断,或者最小的栈地址)。为了进一步精确定位,我们可以输入以下的命令:image lookup --address 0x4af8
命令执行后返回:Address: ControlStyleDemo[0x4af8] (ControlStyleDemo.__TEXT.__text + 13288)
Summary: ControlStyleDemo`-[RootViewController viewDidLoad] + 312 at RootViewController.m:53
我们可以看到,出错的位置是&RootViewController.m&的第53行。更多的命令可以参见&&。另外,facebook开源了他们扩展的&&,有兴趣的朋友也可以安装看看。简称和别名很多时候,LLDB完整的命令是很长的。比如前面所说的&image lookup --address&这个组合命令。为了方便日常的使用,提高效率,LLDB命令也提供通过简称的方式调用命令。还是这个命令,我们用简称就可以写为&im loo -a&,是不是简单多了。如果你是从gdb时代就开始使用调试器的,你会发现,有些命令如&p&、&call&等命令和gdb下是一致的。其实这些命令是LLDB一些命令的别名,比如&p&是&frame variable&的别名,&p view&实际上是&frame variable view&。除了系统自建的LLDB别名,你也可以自定义别名。比如下面这个命令command alias ioa image lookup --address %1
是将我前面所介绍过的一个命令&image lookup --address&添加了一个&ioa的别名。然后执行下面的命令:(lldb) ioa 0x4af8
Address: ControlStyleDemo[0x4af8] (ControlStyleDemo.__TEXT.__text + 13288)
Summary: ControlStyleDemo`-[RootViewController viewDidLoad] + 312 at RootViewController.m:53
可以看到,我们得到了我们想要的结果,而命令却大大缩短。这里我就不再详细展开,有兴趣的朋友可以查看&&。常见问题上面我们简单的学习了如何使用LLDB命令。但有时我们在使用这些LLDB命令的时候,依然可能会遇到一些问题。比如下面这个命令。(lldb) p NSLog(@"%@",[self.view
viewWithTag:1001])
error: 'NSLog' has unknown return cast the call to its declared return type
error: 1 errors parsing expression
如果在使用LLDB命令中发现有 unknown type 的类似错误(多见于id类型,比如NSArray中某个值),那我们就必须显式声明类型。比如上面这个命令,我们得这么修改。p (void)NSLog(@"%@",[self.view
viewWithTag:1001])
这样就能得到正确的结果了。执行类命令集LLDBGDBLaunch a process no arguments.(lldb)&process launch&(lldb)&run&(lldb)&r(gdb)&run&(gdb)&rLaunch a process with arguments&&args&&.(lldb)&process launch — &args&&(lldb)&r &args&(gdb)&run &args&&(gdb)&r &args&Launch a process for with arguments&a.out 1 2 3&without having to supply the args every time.%&lldb — a.out 1 2 3&(lldb)&run&…&(lldb)&run&…%&gdb –args a.out 1 2 3&(gdb)&run&…&(gdb)&run&…Launch a process with arguments in new terminal window (Mac OS X only).(lldb)&process launch –tty — &args&(lldb)&pro la -t — &args&Launch a process with arguments in existing terminal&/dev/ttys006 (Mac OS X only).(lldb)&process launch –tty=/dev/ttys006 — &args&(lldb)&pro la -t/dev/ttys006 — &args&Attach to a process with process ID 123.(lldb)&process attach –pid 123&(lldb)&attach -p 123(gdb)&attach 123Attach to a process named “a.out”.(lldb)&process attach –name a.out&(lldb)&pro at -n a.out(gdb)&attach a.outWait for a process named “a.out” to launch and attach.(lldb)&process attach –name a.out –waitfor&(lldb)&pro at -n a.out -w(gdb)&attach -waitfor a.outDo a source level single step in the currently selected thread.(lldb)&thread step-in&(lldb)&step&(lldb)&s(gdb)&step&(gdb)&sDo a source level single step over in the currently selected thread.(lldb)&thread step-over&(lldb)&next&(lldb)&n(gdb)&next&(gdb)&nDo an instruction level single step in the currently selected thread.(lldb)&thread step-inst&(lldb)&si(gdb)&stepi&(gdb)&siDo an instruction level single step over in the currently selected thread.(lldb)&thread step-inst-over&(lldb)&ni(gdb)&nexti&(gdb)&niStep out of the currently selected frame.(lldb)&thread step-out&(lldb)&finish(gdb)&finishBacktrace and disassemble every time you stop.(lldb)&target stop-hook addEnter your stop hook command(s). Type ‘DONE’ to end.& bt& disassemble –pc& DONEStop hook #1 added.断点类命令集LLDBGDBSet a breakpoint at all functions named&main&.(lldb)&breakpoint set –name main&(lldb)&br s -n main&(lldb)&b main(gdb)&break mainSet a breakpoint in file&test.c&at line&&12&.(lldb)&breakpoint set –file test.c –line 12&(lldb)&br s -f test.c -l 12&(lldb)&b test.c:12(gdb)&break test.c:12Set a breakpoint at all C++ methods whose basename is&main&.(lldb)&breakpoint set –method main&(lldb)&br s -M main(gdb)&break main&(Hope that there are no C funtions named&main&)&.Set a breakpoint at and object C function:&-[NSString stringWithFormat:]&.(lldb)&breakpoint set –name “-[NSString stringWithFormat:]”&(lldb)&b -[NSString stringWithFormat:](gdb)&break -[NSString stringWithFormat:]Set a breakpoint at all Objective C methods whose selector is&count&.(lldb)&breakpoint set –selector count&(lldb)&br s -S count(gdb)&break count&(Hope that there are no C or C++ funtions named&count&)&.List all breakpoints.(lldb)&breakpoint list&(lldb)&br l(gdb)&info breakDelete a breakpoint.(lldb)&breakpoint delete 1&(lldb)&br del 1(gdb)&delete 1监视点(WATCHPOINT)命令集LLDBGDBSet a watchpoint on a variable when it is written to.(lldb)&watchpoint set variable -w write global_var&(lldb)&watch set var -w write global_var(gdb)&watch global_varSet a watchpoint on a memory location when it is written into. The size of the region to watch for defaults to the pointer size if no ‘-x byte_size’ is specified. This command takes raw input, evaluated as an expression returning an unsigned integer pointing to the start of the region, after the ‘–’ option terminator.(lldb)&watchpoint set expression -w write — my_ptr&(lldb)&watch set exp -w write — my_ptr(gdb)&watch -location g_char_ptrSet a condition on a watchpoint.(lldb)&watch set var -w write global(lldb)&watchpoint modify -c ‘(global==5)’(lldb)&c…(lldb)&bt* thread #1: tid = 0x1c03, 0x0ef5 a.out&modify + 21 at main.cpp:16, stop reason = watchpoint 1frame #0: 0x0ef5 a.out&modify + 21 at main.cpp:16frame #1: 0x0eac a.out&main + 108 at main.cpp:25frame #2: 0x00007fff8ac9c7e1 libdyld.dylib&start + 1(lldb)&frame var global(int32_t) global = 5List all watchpoints.(lldb)&watchpoint list&(lldb)&watch l(gdb)&info breakDelete a watchpoint.(lldb)&watchpoint delete 1&(lldb)&watch del 1(gdb)&delete 1检查变量LLDBGDBShow the arguments and local variables for the current frame.(lldb)&frame variable(gdb)&info args&and&(gdb)&info localsShow the local variables for the current frame.(lldb)&frame variable –no-args&(lldb)&fr v -a(gdb)&info localsShow the contents of local variable “bar”.(lldb)&frame variable bar&(lldb)&fr v bar&(lldb)&p bar(gdb)&p barShow the contents of local variable “bar” formatted as hex.(lldb)&frame variable –format x bar&(lldb)&fr v -f x bar(gdb)&p/x barShow the contents of global variable “baz”.(lldb)&target variable baz&(lldb)&ta v baz(gdb)&p bazShow the global/static variables defined in the current source file.(lldb)&target variable&(lldb)&ta vn/aDisplay a the variable “argc” and “argv” every time you stop.(lldb)&target stop-hook add –one-liner “frame variable argc argv”&(lldb)&ta st a -o “fr v argc argv”&(lldb)&display argc&(lldb)&display argv(gdb)&display argc&(gdb)&display argvDisplay a the variable “argc” and “argv” only when you stop in the function named&main&.(lldb)&target stop-hook add –name main –one-liner “frame variable argc argv”(lldb)&ta st a -n main -o “fr v argc argv”Display the variable “*this” only when you stop in c class named&MyClass&.(lldb)&target stop-hook add –classname MyClass –one-liner “frame variable *this”(lldb)&ta st a -c MyClass -o “fr v *this”检查线程状态LLDBGDBShow the stack backtrace for the current thread.(lldb)&thread backtrace&(lldb)&bt(gdb)&btShow the stack backtraces for all threads.(lldb)&thread backtrace all&(lldb)&bt all(gdb)&thread apply all btSelect a different stack frame by index for the current thread.(lldb)&frame select 12(gdb)&frame 12List information about the currently selected frame in the current thread.(lldb)&frame infoSelect the stack frame that called the current stack frame.(lldb)&up&(lldb)&frame select –relative=1(gdb)&upSelect the stack frame that is called by the current stack frame.(lldb)&down&(lldb)&frame select –relative=-1&(lldb)&fr s -r-1(gdb)&downSelect a different stack frame using a relative offset.(lldb)&frame select –relative 2&(lldb)&fr s -r2&(lldb)&frame select –relative -3(lldb)&fr s -r-3(gdb)&up 2&(gdb)&down 3Show the general purpose registers for the current thread.(lldb)&register read(gdb)&info registersShow the general purpose registers for the current thread formatted as&signed decimal&. LLDB tries to use the same format characters as&&printf(3)&when possible. Type “help format” to see the full list of format specifiers.(lldb)&register read –format i(lldb)re r -f i&LLDB now supports the GDB shorthand format syntax but there can’t be space after the command:(lldb)&register read/dShow all registers in all register sets for the current thread.(lldb)&register read –all&(lldb)&re r -a(gdb)&info all-registersShow the values for the registers named “rax”, “rsp” and “rbp” in the current thread.(lldb)&register read rax rsp rbp(gdb)&info all-registers rax rsp rbpShow the values for the register named “rax” in the current thread formatted as&binary&.(lldb)&register read –format binary rax&(lldb)&re r -f b rax&LLDB now supports the GDB shorthand format syntax but there can’t be space after the command:(lldb)&register read/t rax(lldb)&p/t $rax(gdb)&p/t $raxRead memory from address 0xbffff3c0 and show 4 hex uint32_t values.(lldb)&memory read –size 4 –format x –count 4 0xbffff3c0&(lldb)&me r -s4 -fx -c4 0xbffff3c0&(lldb)&x -s4 -fx -c4 0xbffff3c0&LLDB now supports the GDB shorthand format syntax but there can’t be space after the command:(lldb)&memory read/4xw 0xbffff3c0(lldb)&x/4xw 0xbffff3c0(lldb)&memory read –gdb-format 4xw 0xbffff3c0(gdb)&x/4xw 0xbffff3c0Read memory starting at the expression “argv[0]“.(lldb)&memory read&&argv[0]&NOTE:&&any command can inline a scalar expression result (as long as the target is stopped) using backticks around any expression:&(lldb)&memory read –size&&sizeof(int)&argv[0](gdb)&x argv[0]Read 512 bytes of memory from address 0xbffff3c0 and save results to a local file as&text&.(lldb)&memory read –outfile /tmp/mem.txt –count 512 0xbffff3c0&(lldb)&me r -o/tmp/mem.txt -c512 0xbffff3c0&(lldb)&x/512bx -o/tmp/mem.txt 0xbffff3c0(gdb)&set logging on&(gdb)&set logging file /tmp/mem.txt&(gdb)&x/512bx 0xbffff3c0&(gdb)&set logging offSave binary memory data starting at 0×1000 and ending at 0×2000 to a file.(lldb)&memory read –outfile /tmp/mem.bin –binary 0×00(lldb)&me r -o /tmp/mem.bin -b 0×00(gdb)&dump memory /tmp/mem.bin 0×00Disassemble the current function for the current frame.(lldb)&disassemble –frame&(lldb)&di -f(gdb)&disassembleDisassemble any functions named&main&.(lldb)&disassemble –name main&(lldb)&di -n main(gdb)&disassemble mainDisassemble an address range.(lldb)&disassemble –start-address 0x1eb8 –end-address 0x1ec3&(lldb)&di -s 0x1eb8 -e 0x1ec3(gdb)&disassemble 0x1eb8 0x1ec3Disassemble 20 instructions from a given address.(lldb)&disassemble –start-address 0x1eb8 –count 20&(lldb)&di -s 0x1eb8 -c 20(gdb)&x/20i 0x1eb8Show mixed source and disassembly for the current function for the current frame.(lldb)&disassemble –frame –mixed&(lldb)&di -f -mn/aDisassemble the current function for the current frame and show the opcode bytes.(lldb)&disassemble –frame –bytes&(lldb)&di -f -bn/aDisassemble the current source line for the current frame.(lldb)&disassemble –line&(lldb)&di -ln/a可执行文件和共享库查询命令LLDBGDBList the main executable and all dependent shared libraries.(lldb)&image list(gdb)&info sharedLookup information for a raw address in the executable or any shared libraries.(lldb)&image lookup –address 0x1ec4&(lldb)&im loo -a 0x1ec4(gdb)&info symbol 0x1ec4Lookup information for an address in&a.out only.(lldb)&image lookup –address 0x1ec4 a.out(lldb)&im loo -a 0x1ec4 a.outLookup information for for a type&Point&by name.(lldb)&image lookup –type Point&(lldb)&im loo -t Point(lldb)&ptype PointDump all sections from the main executable and any shared libraries.(lldb)&image dump sections(gdb)&maintenance info sectionsDump all sections in the&a.out&module.(lldb)&image dump sections a.outDump all symbols from the main executable and any shared libraries.(lldb)&image dump symtabDump all symbols in&a.out&and&&liba.so&.(lldb)&image dump symtab a.out liba.so杂项LLDBGDBEcho text to the screen.(lldb)&script print “Here is some text”(gdb)&echo Here is some text\n
阅读(1173)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'Xcode调试技巧',
blogAbstract:'原文链接:'
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 xcode怎么导入pop框架 的文章

 

随机推荐