专栏首页搜狗测试iOS代码调试之LLDB命令

iOS代码调试之LLDB命令

前言

在iOS系统的APP程序开发中,经常需要代码的调试跟踪,最常用的就是LLDB Debugger程序调试器,LLDB Debugger (LLDB) 是一个开源、底层调试器(low level debugger),具有REPL (Read-Eval-Print Loop,交互式解释器)、C++和Python插件,位于Xcode窗口底部控制台中,也可以在terminal中使用。具有流向控制 (flow control) 和数据检查 (data inspection) 功能。 对于测试同学来说,学习iOS代码调试LLDB命令,能更好地辅助我们通过各种手段如修改变量返回值创造实际难以模拟的环境进行测试,甚至能协助开发同学定位bug。下面小编来分享一些平时常用到的iOS代码调试LLDB命令,希望能对做iOS测试的同学有所帮助。

常用LLDB命令

LLDB调试模式开启:首先在需要调试的代码处设置断点,当程序走到断点时,就能在控制台区看到我们已经进入LLDB模式了,如下图所示:

在LLDB模式下,根据需要输入相关的LLDB调试命令既可进行代码调试,下面小编将给大家介绍几款常用的LLDB命令。 1.打印 打印是代码调试中最常用的命令,相关的命令有:p和po。 p 命令: print 命令的简写,使用p 命令可以查看基本数据类型的值;如果使用p命令查看的是对象,那么只会返回对象的指针地址。 p命令后面除了可以接变量、常量,还可以接表达式。 po 命令:print object的缩写,可以理解为打印对象。功能与p命令类似,也可以打印常量、变量,打印表达式返回的对象等。p 和 po 的区别在于使用 po 只会输出对应的值,而 p 则会返回值的类型以及命令结果的引用名。 用法如下:

在输出结果中有类似于$0,$1这样的符号,它是指向对象的一个引用,在控制面板中可以直接使用这个符号来操作对应的对象,它们存在于LLDB的全名空间中,目的是为了辅助调试。$后面的数值是递增的,每打印一个与对象相关的命令,这个值都会加1。 打印对象除了以上命令外,也可以在控制台左侧区域,点击变量右键点击 Print Description of “xxx”,或者选中变量后,点击下边栏的i按钮,即可在控制台区看到打印结果:

2.expression 修改参数值 expression命令是调试过程中最有价值有命令了,既可以打印值也可以修改值。它能够在调试时,动态的修改变量的值,同时打印出结果,在调试想要让应用执行异常路径(如执行某else情况)或者修改某些中间变量值如(如修改返回状态码以查看客户端相关响应等)非常有用,可以创造各种实际中难以遇到的测试环境辅助测试。用法举例如下图:

expression命令是动态修改变量的值,Xcode还支持动态调用函数。在控制台执行call命令,可以在不修改代码,不重新编译的情况下,在断点调用某个方法,并输出此方法的返回值。 3.image寻址 image 命令主要用于寻址,一般是通过各种组合命令实现不同功能。 image list命令用来查看工程中使用的库:

image lookup --address+地址 该命令用于查找可执行文件或共享库的原始地址,当遇到程序崩溃时,可以使用这条命令来根据崩溃日志的原始地址查找崩溃所在的具体位置。

4.线程和帧状态检测 在进程停止后,LLDB会选择一个当前线程和线程中当前帧(frame)。很多检测状态的命令可以用于这个线程或帧。 1) thread list 用于列出所有线程,如下图所示,其中星号(*)表示thread#1为当前线程。

2)thread backtrace堆栈打印,简写bt bt命令可以打印出线程的堆栈信息,bt命令是打印当前线程的堆栈信息,如下图所示。该信息比左侧的Debug Navigator 看到的还要详细一些。如果嫌堆栈打印太长,可以加一个值限制,如bt 10。

bt all 命令可以打印所有线程的堆栈信息。 3)thread return 跳出当前方法的执行 thread return主要用于控制程序流程,如想要直接跳过执行某个方法,或者直接让某方法返回一个想要的值,thread return后有一个可选参数,在执行时它会把可选参数加载进返回寄存器里,然后立刻执行返回命令,跳出当前栈帧(如:numberOfSectionsInTableView:方法直接thread return 10,就可以直接跳过方法执行,返回10)。 4)frame variable查看帧变量 frame variable命令显示当前帧的变量,默认输出当前帧所有参数和所有局部变量,如下图所示:

5.流程控制 使用xcode运行程序到达断点时会就会停止运行,调试条上会出现四个可以用来控制程序的执行流程的按钮,功能分别是 “继续”和“暂停”、“下一步”、“进入”、“跳出”。

也可以分别用LLDB命令c,n,s,finish去实现。 • continue : 继续执行下去到达下一个断点(process continue),或者使用缩写 c; • next : 单步执行到下一个语句(process step-over),缩写 n; • step : 跳进一个函数调试(process step-into),缩写 s; • finish : 继续执行到下一个断点或返回语句,然后再次停止(process step-out)。 6.帮助命令 1) help 可以列出所有可以用于调试代码的命令及功能说明,如下图:

2) help<command> 列出某个命令更多的细节,例如help thread命令可以查看thread相关的命令及功能。

3)apropos apropos提供了一种更直接的方式来查看LLDB有哪些功能,使用”apropos+关键字“命令,它会根据关键字来搜索LLDB帮助文档,并为每个命令选取一个帮助字符串。使用举例如下图所示:

结束语

本文小编分享了测试工作中iOS代码调试之常用的几类LLDB命令,如果需要用到其他的LLDB命令可以随时借助help命令进行查询其用法,当然iOS代码调试除了LLDB命令之外,还可以进行断点调试,最常使用的是LLDB命令和断点操作混合调试,本文只是抛砖引玉,需要的同学可以在网上进行更深入了解学习~。

本文分享自微信公众号 - 搜狗测试(SogouQA),作者:zhonglv

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android中进程间通信(IPC)方式,知多少?

    小编在车机项目测试中,有很多的定制需求,需要系统或者第三方应用和车机应用进行通信,故针对此部分学习下,希望不再做测试小白。

    用户5521279
  • 压力测试中的子服务mock

    做压力测试有很多让人头疼的问题,例如:数据构造、机器准备、发压机性能差、带宽不够等;目前越来越多的服务引入的子服务、微服务的概念,这给性能测试增加了另一个问题—...

    用户5521279
  • Flask框架使用

    我们在搭建一下接口测试平台或者管理一些脚本的时候,通常希望有一个web页面来维护,今天就介绍一款使用python编写的轻量级Web应用框架,自带开...

    用户5521279
  • 进程的描述和创建

    进程在内核态运行时需要自己的堆栈信息,linux内核为每个进程都提供了一个内核栈。对每个进程,Linux内核都把两个不同的数据结构紧凑的存放在一个单独为进程分配...

    0x222进制
  • Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】

    Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息。它定义在include/linux/sc...

    233333
  • Android 中进程的级别以及 Service 的优先级

    总结: 我们已经知道有这 5 个进程了,并且他们的优先级都列出来的,这样我们就可以根据优先级来让我们的 APP 尽量不被杀死了。

    开发者
  • Python采用并发查询mysql以及调用API灌数据 (六)- 解决datetime序列化json格式问题

    上一篇文章已经编写了mysql查询以及生成请求api的body数据,那么本章节我们来继续编写解决body序列化json过程中的datetime转化问题。

    Devops海洋的渔夫
  • js引擎v8源码解析之平台相关(上篇)(基于v8 0.1.5)

    PlatformData 是管理线程中,不同系统中的数据。这里只看linux系统。只保存了线程id。

    theanarkh
  • docker镜像的导入和导出

    有暗香盈袖
  • LOCK Prefix (lock) Intel X86 IA-32 Assembly Language Reference Manual

    The LOCK # signal is asserted during execution of the instruction following the ...

    战神伽罗

扫码关注云+社区

领取腾讯云代金券