大佬教程收集整理的这篇文章主要介绍了xcode – 如何在LLDB断点条件下使用堆栈内容?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一种情况,我们在发布期间有媒体播放,并且objc_exception_throw()在此期间大约有5次点击,但总是被捕获,并且它在媒体播放器对象的南边.
我厌倦了(a)必须手动连续n次,或者(b)在播放完成之前必须禁用断点.
我尝试过的:
>使断点忽略前五次命中(问题:它并不总是正好五次)
>使用我的目标作为模块创建我自己的符号断点(问题:没有改变)
我想做什么:
想到的一个解决方案是在断点命中时评估堆栈,并在其中列出特定方法或功能时继续.但我不知道该怎么做.
其他想法也欢迎.
该函数在回溯中抓取函数的名称,并使用忽略列表将这些名称与这些名称相交.如果任何名称匹配,它将继续运行该过程.这有效地跳过调试器中的不需要的堆栈.
(lldb) b objc_exception_throw Breakpoint 1: where = libobjc.A.dylib`objc_exception_throw,address = 0x00000000000113c5 (lldb) script Python InteractivE interpreter. To exit,type 'quit()','exit()' or Ctrl-D. >>> ignored_functions = ['recurse_then_throw_and_catch'] def conTinue_ignored(frame,bp_loc,Dict): global ignored_functions names = set([frame.GetFunctionName() for frame in frame.GetThread()]) all_ignored = set(ignored_functions) ignored_here = all_ignored.intersection(names) if len(ignored_herE) > 0: frame.GetThread().GetProcess().ConTinue() quit() (lldb) br comm add -F conTinue_ignored 1 (lldb) r
我在下面的文件中尝试了它,它成功地跳过recurse_then_throw_and_catch中的第一次抛出,并在throw_for_real内部抛出时进入调试器.
#import <Foundation/Foundation.h> void f(int n) { if (n <= 0) @throw [NSException exceptionWithName:@"plugh" reason:@"foo" userInfo:nil]; f(n - 1); } void recurse_then_throw_and_catch(void) { @try { f(5); } @catch (NSException *E) { NSLog(@"Don't care: %@",E); } } void throw_for_real(void) { f(2); } int main(void) { recurse_then_throw_and_catch(); throw_for_real(); }
我想你可以将这个函数添加到.lldbinit中,然后根据需要从控制台将它连接到断点. (我认为你不能在xcode中设置脚本命令.)
以上是大佬教程为你收集整理的xcode – 如何在LLDB断点条件下使用堆栈内容?全部内容,希望文章能够帮你解决xcode – 如何在LLDB断点条件下使用堆栈内容?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。