iOS 的断点你知道多少?

引言

在App的开发中项目代码调试是不可缺少的步骤。其中断点调试也只每个开发者必备的技能。就针对断点而言是不是还有大多数开发者还是对断点的理解停留在基本的认识上?

基本的断点


上图中标记的就是我们常用的断点。作用是:让项目代码运行到这里的时候暂停,不在继续向下运行。这就是我们常用的断点,你如果认为它就这么一点使用那就错了。我们把鼠标移动到被标记的断点上点击鼠标右键,将弹出一个矩形框如下:

从上图我们可以看到包含4个模块,分别是: Edit Breakpoint...  /  Disable Breakpoint  / Delete  Breakpoint / Reveal in Bearkpoint Navigator 。它们的作用分别是: 编辑断点 / 断点不可用 / 删除断点 /  将断点在Reveal调试器中展示断点顺序。

Edit Breakpoint...  

点击 Edit Breakpoint...  之后会弹出如下图所示:
从上图我们能看到大致5个模块。ViewController.m:20 / Condition  /  ignore / Action / Options   。
第一:ViewController.m:20  
         前面的对号,如果勾选掉,则表示该断点不可用,否则为可用。其中ViewController.m是该断点所在类的名字。20 表示改短点在所在类中的行数。
第二:Condition 
         表示判断条件。 比如一个循环中 i==10 的时候停下来,这个时候你就可以在这里下 'i == 10'  ,测试结果如下:

第三:Ignore 
        断点忽略的次数。例如下图设置:


从上图可以看到 我们把 ‘Ignore’ 设置为10 ,就是程序运行到这里的时候可以忽略10次断点,第十一次就要停止到这里不能继续向下执行。测试结果如下图所示:

从上图输出的结果和我们设置的 ‘Ignore’ 的值对比,我们发现结果是正确的。

第四: Action

点击 Add Action 后,会弹出如下图所示:


从上图我们可以看到 Action 有6种模式可选,分别如下: AppleScript  /  Capture CPU Farame / Debugger Command  /  Log Message / Shell  Command / Sound 。

1. 选择 AppleScript 会显示下面的面板


上图选择 AppleScript ,我们可以在下面的输入框里面输入脚本,在程序走到该断点的时候,就执行该添加的脚本。我们举例如下:

从上图可以看到。我们添加的脚本是 '' say  "王者荣耀" using "" ''。 这个脚本的作用是就是让电脑发生朗读王者荣耀四个字。经过测试,我们的说法是正确的,可以发声。需要注意了,看到上图右下方有 @exp@   /  %B  / %H 等显示,他们的作用是: @exp@ 是输出异常的原因 、 %B 是输出断点所在方法的名字、 %H 断点的次数。


2、选择 Debugger Command  会显示如下面板

我们从上图可以看到 Debugger Command 下方出现一个输入框,提示'' Debugger Command like po foo'' 。这是提示我们如何写的。我们按照它们给的例子写  ‘po i’。经过测试如下图所示:

从上图我们的 “po i” ,然后在 debugger 日志输出我们打印的参数。

3、选择  Log Message 会显示线面的面板

从上图可以看到 Log Message  下面有个输入框,还有一个选择输出的形式分别是: log message  to  console 和  Speak message 意思就是 一个是在控制台输出和电脑朗读出来。默认控制台输出。
其中,@exp@ / %B  / %H 我们不在介绍,在 选择AppleScript的模块里已经介绍很详细。我们在输入框里写入   " @exp@     %B      %H" ,测试结果是:

从上图的测试结果和我们介绍的是完全复合的。

4、选择 Sound ,会显示下面模板界面。

当我们把 Action 选择到 Sound 的时候,这是当程序运行到改断点的时候,电脑就会发出你选择的声音。声音也可以有一下选择:

5、选择 Shell Command 会显示下面的模板

从上图来看,有让输入指令的地方和输出参数的地方。我们有以下如图所示的测试:

我们通过 Shell 指令  ‘echo’ 输出异常原因、异常所在的方法名、断点的次数。其中 Wait  until done 是执行的时机而已。

6、 选择 Capture CPU Farame  是 Cup 动作异常捕捉。


第五、Options 

这个模块的作用是,当程序遇到断点评估后是停止运行还是继续运行。勾选之后,程序遇到断点后继续执行,否则,停止运行。使用性很高。在测试的时候可以不停止运行而达到测试的结果。

DIsable   Breakponit

这个的作用是让当前的断点失效,而不是清楚。点击之后该模块就变成 “Enable  Breakpoint” ,断点的颜色变浅。


Delete  Breakpoint 

这个的作用是删除断点,而不是让断点失效。这个和直接长按断点拖拽取消点断是一个道理。

Reveal in Breakpoint Navigator 

这是揭示断点导航,它将会跳转到下面的模块,如下图:


从上图我们很明显就能得到我们都想要得到的数据。




其他断点

在Xcode 的断点导航列表左下方有一个 ‘+’,当我们点击这个 “+”就会弹出一个选择框,如下图:



从上图我们可以看到一共有6种选择,分别是: Swift Error Breakpoint  /   Exception Breakpoint / OpenGL ES Error Breakpoint \ Symbolic Breakpoint \  Constraint   Error Breakpoint \ Test Failure Breakpoint 。 




Swift Error Breakpoint 

这是Swift 程序出现问题而设置断点。改断点也包含 编辑、失效、删除、分享、断点帮助等模块。该断点的编辑和普通断点的编辑是一样的。


Exception Breakpoint

这是程序发生异常抛出断点。有这个断点就可以检测到整个App 程序哪里有异常情况。该断点包含编辑、失效、删除、分享、断点帮助等模块。其中断点编辑和普通的有点不同如下图所示:



从上图我们看到它包含了4个模块,分别是  Exception \ Break \ Action \ Options 。 其中 Action 和 Options 在上面我们已经介绍过了。我们就详细介绍前面两个模块。

1>  Exception

其中 Exception 有三个选项分别是  All \   Objective-C \ C++ 。 

All 的意思是监控整个程序的所有异常。

Objective-C 的意思是只监控有 OC 编写的程序发生的异常。

C++ 的意思是只监控程序有C++ 编写的程序发生的异常。



2> Break 

Break 字面是停止的意思。其中 Break 有两种选择  On Throw  \ On Catch 。

On Throw : 是程序发生异常时,能定位到异常的位置。

on Catch : 是程序发生异常时,不能定位到异常的位置,只能定位到主函数里( mian.m)。




Symbolic Breakpoint


这是系统异常时断点检测模块。该断点包含编辑、失效、删除、分享、断点帮助等模块。其中点击编辑该断点将会出现如下面板:


从上图可以看到,该模块包含6个项,分别是: Symbol \ Module \ Condition \ Ignore \ Action \ Options 。其中除了 Symbol 和 Module 没有介绍过,其他的都在普通断点时已经介绍过了。下面我们介绍Symbol \ Module  两个模块。

1> Symbol

Symbol 主要包括如下:

1》 方法名称,整个App程序内的方法名称全部监控,例如: - viewDidLoad 。
2》特定的类方法。例如: [[ QLPreviewController alloc ] init ]。
3》函数名。


2> Module 
Module 主要是一些系统的静态文件和配置文件的异常检测。



Constraint   Error Breakpoint

这个主要是程序内空间的约束发生异常时,才会执行该约束断点。


Test Failure Breakpoint 
这个类型的断点会在test assertion 失败的时候暂停程序的执行。



OpenGL ES Error Breakpoint

多维图形绘制时,发生异常时,触发的断点。















  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS越狱开发中,常用的Hook检测包括以下几种: 1. 检测当前进程是否被其他进程注入 ``` void anti_injection() { char path[1024]; int ret = proc_pidpath(getpid(), path, sizeof(path)); if (ret <= 0) { NSLog(@"anti_injection: proc_pidpath failed"); exit(1); } if (strstr(path, "/Library/MobileSubstrate") != NULL) { NSLog(@"anti_injection: MobileSubstrate detected"); exit(1); } if (strstr(path, "/Library/Frameworks/CydiaSubstrate.framework") != NULL) { NSLog(@"anti_injection: CydiaSubstrate detected"); exit(1); } } ``` 2. 检测是否被调试 ``` void anti_debugging() { int name[4]; struct kinfo_proc info; size_t info_size = sizeof(info); name[0] = CTL_KERN; name[1] = KERN_PROC; name[2] = KERN_PROC_PID; name[3] = getpid(); if (sysctl(name, 4, &info, &info_size, NULL, 0) == -1) { NSLog(@"anti_debugging: sysctl failed"); exit(1); } if (info.kp_proc.p_flag & P_TRACED) { NSLog(@"anti_debugging: traced"); exit(1); } } ``` 3. 检测是否被hook ``` void anti_hooking() { const char *functionName = "ptrace"; void *handle = dlopen("/usr/lib/libc.dylib", RTLD_GLOBAL | RTLD_NOW); if (handle == NULL) { NSLog(@"anti_hooking: dlopen failed"); exit(1); } void *ptrace_func = dlsym(handle, functionName); if (ptrace_func == NULL) { NSLog(@"anti_hooking: dlsym failed"); exit(1); } if (ptrace_func != (void *)&ptrace) { NSLog(@"anti_hooking: hook detected"); exit(1); } } ``` 4. 检测是否被注入Cycript等调试工具 ``` void anti_cycript() { char *cycript = strstr(getenv("DYLD_INSERT_LIBRARIES"), "cycript"); if (cycript != NULL) { NSLog(@"anti_cycript: cycript detected"); exit(1); } } ``` 此外,还可以在代码中添加闪退检测断点,当程序发生闪退时就可以打断点进行调试,例如: ``` void crash_handler(int signal) { signal(SIGTRAP, NULL); NSLog(@"crash_handler: signal=%d", signal); exit(1); } void set_crash_handler() { signal(SIGTRAP, crash_handler); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值