Xcode——LLDB Debugger 与断点调试学习

server/2024/12/3 7:56:45/

LLDB_Debugger__0">Xcode——LLDB Debugger 与断点调试学习

文章目录

  • Xcode——LLDB Debugger 与断点调试学习
    • 前言
    • 介绍
    • 打开LLDB
    • 命令
      • help
      • print
      • expression
    • 断点调试
      • 异常断点——Exception Breakpoint
      • 标志断点——Symbolic Breakpoint
      • watchpoint
        • set
      • 断点行为
      • condition条件判断
    • 最后
    • 参考文章

前言

在前几日完成知乎日报项目的过程之中,运行调试是在写项目过程之中最头疼的事情,偶然看到隔壁的倪神在学习LLDB相关的BUG调试的内容,于是就对LLDB进行学习了解

介绍

LLDB 是 Apple 提供的一个强大且现代化的调试工具,主要用于调试 macOS 和 iOS 应用程序。它是 Xcode 默认的调试器,具有高效、快速的特点,支持多种编程语言,包括 Objective-C、Swift 和 C/C++。LLDB 绑定在 Xcode 内部,存在于主窗口底部的控制台中。调试器允许你在程序运行的特定时暂停它,你可以查看变量的值,执行自定的指令,并且按照你所认为合适的步骤来操作程序的进展。

LLDB_11">打开LLDB

在我们平时的编程之中,有些时候也会用到断点去进行调试,相信大家在使用断点时,Xcode总会出现以下界面吧

image-20241126203010658

这个绿色的llbd字样的内容,一直没有引起我的注意,知道学习了lldb才知道这个就是我们进行调试的关键,我们先给出一个简单的程序框架,来开始我们对lldb的学习

命令

image-20241126204128249

help

第一个lldb的命令就是help,它可以列出所有的命令,如果你忘记了一个命令的具体作用。你可以使用help + 具体的命令名,例如:help print

print

这个函数很简单,顾名思义就是打印出变量或者对象,我们在lldb命令框之中写入以下内容

print c

image-20241126204857555

注:LLDB为了简便操作,其实会实现前缀匹配,所以我们可以使用p,pri,prin来运行print,至于pr会和process命令冲突所以无法使用

这个print会将c的类型等相关信息打印出来,如果说我们打印的是一个数组,那么显示就会变得很复杂,所以我们呢可以用上另一个打印函数po(print object的缩写),这个函数的作用相当于调用了打印对象的description方法

expression

如果想要改变一个值,或者执行一个方法。可以使用expression或者e

截屏2024-11-26 21.00.09

使用expression这个方法,不仅仅改变了调试器之中的值,而且还改变了程序之中的值,此时我们程序的断点之后添加一个NSLog函数去打印a的值,我们可以看到

截屏2024-11-26 21.20.12

由于expression可以改变值,我们可以动态的改变View的颜色,而不需要重新编译:

// 改变颜色
(lldb) expression self.view.backgroundColor = [UIColor redColor]
// 刷新界面
(lldb) expression [CATransaction flush]

不只是改变颜色,frame,animation等都能改变,非常有用。

如最开始所说,不能直接暂停,必须要在当前界面中触发断点,一般来说我们可以通过重写touch方法添加断点等。

断点调试

当我们设置完断点,运行的时候,就会跳出这四个图标:

image-20241126214722019

  1. continue按钮 => continue,缩写c
  2. step over按钮 => next,缩写n
  3. step in按钮 => step,缩写s
  4. step out按钮 => finish

异常断点——Exception Breakpoint

我们平时总是会在写代码的过程之中遇到在main函数之中错误的情况,或许是数组越界或者是监听失败,约束失效,这些错误不能直接确定在其错误的位置,找到错误的内容确实一件很耗时的事情。其实这个也有一个很简单的解决方法,我们可以在编译器的左上角

image-20241127120706593

点击左下角加号

image-20241127121402135

选择Exception Breakpoint,添加之后,要记得右键这个新建的断点,edit breakpoint,将Enable Breakpoint in DisplayViewController.m:191勾选

image-20241127121539618

接下来我们就可以来看看效果了,这里我们监听了一个不存在的属性名字

image-20241127125819130

标志断点——Symbolic Breakpoint

如果我们选择Symbolic Breakpoint,那么就会弹出以下界面,它比普通断点的自定义设置界面多出了两个内容,

Symbol:用来设置当前断点作用域所能识别的方法,这里面既可以是自定义的方法,也可以是系统的API方法。(注意必须表明是类方法还是成员方法)

例如:

-[MyViewController viewDidAppear:]
+[MyViewController sharedInstance]

Module:模组的意思,用来限制满足符号的方法,编译器将只会在断点满足这个模组的符号的时候才回暂停。

image-20241127192520889

watchpoint

一般情况下可以在属性的 set 方法中添加断点,这样就能监控属性的设置。但是有时候,由于不涉及到方法,而是直接操作内存,无法使用断点,但是我们仍要监视某一个值是否变化,这个时候就可以用watchpoint来监视。

当指针指向变化时,watchpoint会触发:

在这里插入图片描述

set

添加watchpoint的方式如上图所示

(lldb) watchpoint set variable xxx

断点行为

那在这个我们重写的类之中的KVO监听方法就会发生错误,这里就指出了错误发生的地方,并且产生了一个断点。

上面抛出异常时lldb控制台是没有对应的错误信息输出的。那我们可以在右键编辑断点,点击add action,然后输入po $arg1,因为当我们程序报错的时候,断点一个抛出的参数就是错误信息本身,所以使用这个命令可以输出相关的错误信息

image-20241127130658566

condition条件判断

在循环之中设置断点,似乎是一件很麻烦的事情,我们设置断点之后程序就停在了第一次的循环,有时候我们不需要让代码在每次循环或者被调用的时候停下,我们就可以编辑断点之中的Condition选项。

Image_2014-11-22_at_11.58.06_AM-2

最后

NSLog的文档,第一句话就说:Logs an error message to the Apple System Log facility.,首先,NSLog就不是为了普通的debug log进行设计的,而是error log;每次NSLog都会进行很多耗时工作,因此,非重要参数尽量不要用,使用调试之中的print命令进行代替,这也是我们学习lldb的原因所在

参考文章

与调试器共舞 - LLDB 的华尔兹

lldb 调试方法

【iOS】bug调试技巧


http://www.ppmy.cn/server/146960.html

相关文章

linux查询进程的启动时间

说到查询进程的启动时间,你的第一反应肯定是ps -p $pid -o lstart,但是ps 命令通常会通过访问 proc 文件系统来收集进程的信息,它本身是一个外部命令,执行时需要进行进程管理、格式化输出等额外的操作,这会消耗更多的 …

Jmeter 接口测试常见场景

csv 中读取账号密码登录 压测登录接口,通常需要循环读取账号密码,使用 jmeter 处理该需求一般会采用 csv 文件设置来读取账号密码,信息文件(user_info.txt)示例如下: 信息文件中使用英文逗号分割账号、密码…

【LC】35. 搜索插入位置

题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1: 输入: nums [1,3,5,6], target …

Flink常见面试题

1、Flink 的四大特征(基石) 2、Flink 中都有哪些 Source,哪些 Sink,哪些算子(方法) 预定义Source 基于本地集合的source(Collection-based-source) 基于文件的source(…

【Leetcode 每日一题】LCR 190. 加密运算

LCR 190. 加密运算 计算机安全专家正在开发一款高度安全的加密通信软件,需要在进行数据传输时对数据进行加密和解密操作。假定 dataA 和 dataB 分别为随机抽样的两次通信的数据量: 正数为发送量负数为接受量0 为数据遗失 请不使用四则运算符的情况下实…

分布式资源调度——yarn 概述(资源调度基本架构和高可用的实现)

此文章是学习笔记,图片均来源于B站:哈喽鹏程 yarn详细介绍 1、yarn 简介1.1 yarn的简介1.2 yarn 的基本架构1.3. yarn 的高可用 2、yarn 调度策略、运维、监控2.1 yarn 的调度策略2.1.1 FIFO scheduler(先进先出)2.1.2 容量调度2.1.3 公平调度 2.2 yarn…

计算机网络——数据链路层Mac帧详解

目录 前言 一、以太网 二、Mac帧 三、MTU——最大传输单元 四、Mac帧的传输过程 1.ARP协议 2.RARP协议 前言 在之前,我们学习过网络层的IP协议,了解到IP协议解决了从哪里来,到哪里去的问题,也就是提供了将数据从A到B的能力…

本地Docker部署个人在线音乐平台Melody结合内网穿透远程访问听音乐

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…