Android C++ 开发调试 LLDB 工具的使用

news2024/12/28 5:39:12

文章目录

        • 调试环境准备
        • 基础命令
          • Breakpoint Commands
          • Watchpoint Commands
          • Examining Variables
          • Evaluating Expressions
          • Examining Thread State
          • Executable and Shared Library Query Commands
        • 参考:

Android 中在进行 NDK 开发的时候,我们经常需要进行 C++ 代码调试,这里对调试工具 LLDB (Low Lever Debugger)的使用进行介绍。
在 lldb 的官方文档中对 LLDB 的介绍如下:

LLDB is the default debugger in Xcode on macOS and supports debugging C, Objective-C and C++ on the desktop and iOS devices and simulator.

但是到目前为止,Android 上的 NDK 开发也可以使用 LLDB 进行调试,这里记录这么强大且通用的工具相关用法,后续会持续补充。

调试环境准备

因为自己主要做 Android ,因此自己这里使用 Android NDK 项目学习使用 LLDB 调试 c++ 。这里自己使用 github 上的 google ndk jni callback sample 项目。项目跑起来以后,我们在 c++ 代码中加断点,然后就可以看到底部有一个 LLDB 窗口会出来,然后我们就可以在这个窗口输入命令:
在这里插入图片描述

基础命令

最基础的命令 lldb help 查看命令使用 :

help <command> <subcommand>

这里我们输入

help breakpoint # 使用该命令我们可以查看 breakpoint 的用法
help breakpoint set # 使用该命令我们可以查看 breakpoint 的子命令 set 的用法,同样也可以再增加 set 的 subcommand 查看用法

查看官网的文档中的 GDB to LLDB command map ,在使用 LLDB 命令时,可以将命令主要分为下面几类(将日常用使用不到的命令暂时忽略,等有需要再去查看用法):

Breakpoint Commands

设置断点

指定方法名称设置断点:Set a breakpoint at all functions named main

# 给所有的方法名称为 main 的函数设置断点
(lldb) breakpoint set --name main
(lldb) br s -n main
(lldb) b main

指定文件名和行号设置断点:Set a breakpoint in file test.c at line 12

# 指定 test.c 文件,在文件的第 12 行设置
(lldb) breakpoint set --file test.c --line 12
(lldb) br s -f test.c -l 12
(lldb) b test.c:12

设置断点的时候增加条件:Set a conditional breakpoint

(lldb) breakpoint set --name foo --condition '(int)strcmp(y,"hello") == 0'
(lldb) br s -n foo -c '(int)strcmp(y,"hello") == 0'

列出当前的所有断点:List all breakpoints

(lldb) breakpoint list
(lldb) br l

删除断点:Delete a breakpoint

(lldb) breakpoint delete 1 #(这里的数字通过 br l 查看所有的断点信息,最前面的数字可以写到这里)
(lldb) br del 1

禁用或者启用断点:Disable/Enable a breakpoint

(lldb) breakpoint disable/enable 1
(lldb) br dis/en 1
Watchpoint Commands

自己在 android 上 lldb 测试,这个命令不生效,(日常也用这种调试方式)

Examining Variables

显示当前 frame 中的局部变量和参数 :
Show the arguments and local variables for the current frame

frame variable
fr v

显示 frame 中的变量的内容:Show the contents of local variable var

frame variable var

显示全局变量中的内容 : Show the contents of global variable

(lldb) target variable xxx
(lldb) ta v xxx

打印数组的内容:Print an array in memory, assuming we have a pointer like int/float/** *ptr

# int arr[] = {10, 20, 30, 40, 50}; // 声明并初始化一个整数数组    int *ptr; // 声明一个指向int的指针
# ptr = arr; // 让ptr指向arr数组的首元素;等同于 ptr = &arr[0];

# float myArray[5] = {1.2f, 2.0f, 3.0f, 4.0f, 5.0f};
# float* fMyArray = myArray;
# parray <COUNT> <EXPRESSION>
(lldb) parray 5 fMyArray
Evaluating Expressions

打印 c/c++/oc 对象的描述:Printing the ObjC “description” of an object

(lldb) po [SomeClass returnAnObject] # po + 变量名称
Examining Thread State

列出当前 program 中的线程:List the threads in your program

(lldb) thread list

切换后续命令操作的线程:Select thread 1 as the default thread for subsequent commands

(lldb) thread select 1
(lldb) t 1

展示当前线程的调用 tace:Show the stack backtrace for the current thread

(lldb) thread backtrace
(lldb) bt

从给定的地址开始读取 内存

(lldb) memory read `argv[0]`

从指定的变量开始读取指定字节的内存,结果输出到文本文件中:

memory read --outfile /Users/lxd/Desktop/mem.txt --count 512 fMyArray

将文件保存为二进制文件:Save binary memory data starting at 0x1000 and ending at 0x2000 to a file

(lldb) memory read --outfile /Users/lxd/Desktop/mem.bin --binary 0x1000 0x2000
(lldb) me r -o /tmp/mem.bin -b 0x1000 0x2000
Executable and Shared Library Query Commands

这个自己暂时用不上

参考:

链接:https://lldb.llvm.org/use/map.html#execution-commands

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1643445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

漏洞挖掘之某厂商OAuth2.0认证缺陷

0x00 前言 文章中的项目地址统一修改为: a.test.com 保护厂商也保护自己 0x01 OAuth2.0 经常出现的地方 1&#xff1a;网站登录处 2&#xff1a;社交帐号绑定处 0x02 某厂商绑定微博请求包 0x02.1 请求包1&#xff1a; Request: GET https://www.a.test.com/users/auth/weibo?…

88、动态规划-乘积最大子数组

思路&#xff1a; 首先使用递归来解&#xff0c;从0开始到N&#xff0c;每次都从index开始到N的求出最大值。然后再次递归index1到N的最大值&#xff0c;再求max。代码如下&#xff1a; // 方法一&#xff1a;使用递归方式找出最大乘积public static int maxProduct(int[] num…

局部性原理和磁盘预读

局部性原理 磁盘预读 \

Linux---软硬链接

软链接 我们先学习一下怎样创建软链接文件&#xff0c;指令格式为&#xff1a;ln -s 被链接的文件 生成的链接文件名 我们可以这样记忆&#xff1a;ln是link的简称&#xff0c;s是soft的简称。 我们在下面的图片中就是给test文件生成了一个软链接mytest&#xff1a; 我们来解…

【Linux—进程间通信】共享内存的原理、创建及使用

什么是共享内存 共享内存是一种计算机编程中的技术&#xff0c;它允许多个进程访问同一块内存区域&#xff0c;以此作为进程间通信&#xff08;IPC, Inter-Process Communication&#xff09;的一种方式。这种方式相对于管道、套接字等通信手段&#xff0c;具有更高的效率&…

【skill】onedrive的烦人问题

Onedrive的迷惑行为 安装Onedrive&#xff0c;如果勾选了同步&#xff0c;会默认把当前用户的数个文件夹&#xff08;桌面、文档、图片、下载 等等&#xff09;移动到安装时提示的那个文件夹 查看其中的一个文件的路径&#xff1a; 这样一整&#xff0c;原来的文件收到严重影…

孪生网络、匹配网络和原型网络:详解与区分

孪生网络、匹配网络和原型网络 孪生网络、匹配网络和原型网络&#xff1a;详解与区分孪生网络&#xff08;Siamese Networks&#xff09;核心概念工作原理 匹配网络&#xff08;Matching Networks&#xff09;核心概念工作原理 原型网络&#xff08;Prototypical Networks&…

环形链表知识点

目录 判断链表中是否有环快慢指针步数问题 判断链表中是否有环 题目&#xff1a;给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 解决方法&#xff1a;使用快慢指针 如果两个快慢指针相遇&#xff0c;则有环。 如果没有相遇&#xff0c;则没有环。 但是这个原理…

Linux——守护进程化(独立于用户会话的进程)

目录 前言 一、进程组ID与会话ID 二、setsid() 创建新会话 三、daemon 守护进程 前言 在之前&#xff0c;我们学习过socket编程中的udp通信与tcp通信&#xff0c;但是当时我们服务器启动的时候&#xff0c;都是以前台进程的方式启动的&#xff0c;这样很不优雅&#xff0c…

【LinuxC语言】setitimer与getitimer函数

文章目录 前言一、setitimer() 函数二、getitimer() 函数三、示例代码总结 前言 在Linux系统下&#xff0c;编写程序时经常需要使用定时器来实现一些定时任务、超时处理等功能。setitimer() 和 getitimer() 函数是两个用于操作定时器的重要函数。它们可以帮助我们设置定时器的…

第19章 基于质量特性的测试技术

一、功能性测试 &#xff08;一&#xff09;测试方法 等价类边界值法因果图法判定表法场景法 &#xff08;二&#xff09;用例 1、正常用例 2、异常用例 &#xff08;三&#xff09;完备性 1、功能覆盖率 2、X1-A/B 功能覆盖率X&#xff1a;软件实际功能覆盖文档中所有…

【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解

一、计算机网络的发展背景 1、网络的定义 网络是指将多个计算机或设备通过通信线路、传输协议和网络设备连接起来&#xff0c;形成一个相互通信和共享资源的系统。 &#xff08;1&#xff09; 独立模式 独立模式 &#xff1a; 计算机之间相互独立。 &#xff08;2&#xff09;…

VMvare如何更改虚拟机内共享文件夹的挂载点

更改虚拟机内共享文件夹的路径 进入目录 /etc/init.d ,并找到vmware-tools文件 里面有配置项 vmhgfs_mnt"/mnt/hgfs" 将引号内的内容更改为你需要挂载的路径,重启即可 注意挂载的路径不能是 “/”&#xff0c;必须根目录下的某个文件夹&#xff0c;或者其子文件夹 …

在线OJ——链表经典例题详解

引言&#xff1a;本篇博客详细讲解了关于链表的三个经典例题&#xff0c;分别是&#xff1a;环形链表&#xff08;简单&#xff09;&#xff0c;环形链表Ⅱ&#xff08;中等&#xff09;&#xff0c;随机链表的复制&#xff08;中等&#xff09;。当你能毫无压力地听懂和成功地…

面试中算法(使用栈实现队列)

使用栈来模拟一个队列&#xff0c;要求实现队列的两个基本操作:入队、出队。 栈的特点&#xff1a;先入后出&#xff0c;出入元素都是在同一端&#xff08;栈顶&#xff09;。 队列的特点&#xff1a;先入先出&#xff0c;出入元素是在两端&#xff08;队头和队尾)。 分析&…

深度学习:基于Keras,使用长短期记忆神经网络模型LSTM和RMSProp优化算法进行销售预测分析

前言 系列专栏&#xff1a;【机器学习&#xff1a;项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学习模型、处理非…

springboot+vue课程作业成绩可视化大屏分析系统

教师的登录功能。 教师需要可以拥有每学期新增课程的功能。 新增的课程有作业成绩&#xff0c;考勤成绩&#xff0c;考试成绩&#xff0c;实验成绩&#xff0c;其中作业成绩是平时作业1到作业8的平均成绩&#xff0c;最后根据占比得出学期的总评成绩。&#xff08;参考我发的表…

Shell编程debug

debug调试 debug方法 sh -x显示脚本执行过程set命令设置开始debug和结束debug的位置显示脚本某一部分执行过程&#xff0c;解决复杂脚本故障 示例&#xff1a; sh -x 显示脚本执行过程 set显示脚本的部分执行过程 set -x 开始调试&#xff0c;从这里开始显示脚本的详细执行过…

【C++】模板初阶:泛型编程的起点

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

day02-分布式事务

1.分布式事务问题 1.1.本地事务 本地事务&#xff0c;也就是传统的单机事务。在传统数据库事务中&#xff0c;必须要满足四个原则&#xff1a; 1.2.分布式事务 分布式事务&#xff0c;就是指不是在单个服务或单个数据库架构下&#xff0c;产生的事务&#xff0c;例如&#xf…