使用LLDB在VS Code中调试Android C_C++代码(无需Android源码)

2024-05-29 03:58

本文主要是介绍使用LLDB在VS Code中调试Android C_C++代码(无需Android源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

需求分析

在使用GDB在VS Code调试Android C/C++代码(无需Android源码)文章中介绍了如何在VS Code中使用GDB来调试Android C/C++代码,在浏览Android文档Using Debuggers中发现,文档更新了,不建议使用GDB,应尽可能使用LLDB(注意:查看Android文档时,在右上角语言选择ENGLISH,才能浏览最新文档,而不是选择中文-简体)。同样文档中介绍了如何基于Android源码,在VS Code中使用CodeLLDB extension进行调试,下面我们将探索如何在VS Code中不使用Android源码进行调试。

探索过程

官方文档说明

在上述Android文档Using Debuggers中介绍了如何使用LLDB调试。与之前GDB类似,它提到的前置条件是使用Android源码中gdbclient.py或者lldbclient.py(lldbclient.py就是gdbclient.py的软连接)脚本。此脚本会生成VS Code的配置文件,将其设置到launch.json中,并在Android设备上启动lldb-server,在主机上启动lldb,然后将lldb连接到远程的lldb-server。

前人使用记录

在LLDB调试Android Native程序中详细阐述了使用LLDB调试的过程。总结成下面几个核心步骤:

  1. 从NDK中获得获取对应的平台的lldb-server;
  2. 将lldb-server放入设备并启动:./lldb-server p --server --listen unix-abstract:///data/local/tmp/debug.sock
  3. 本机lldb连接远程lldb-server,调试方式分为两种:a、 launch:直接启动要调试的程序; b、 attach:将调试器附到可调试进程中。

那么如何在VS Code中使用LLDB呢,接下来我们实际操作一下。

来实践一下吧

先决条件

1、安装Visual Studio Code以及在其中安装CodeLLDB extension,安装后lldb在此路径下~/.vscode/extensions/vadimcn.vscode-lldb-1.6.1/lldb/bin/lldb,在手动调试时候可以使用。

2、下载好Android NDK,方便使用其中lldb-server,它在<NDK_ROOT>/android-ndk-r21b/toolchains/llvm/prebuilt/linux-x86_64/lib64/clang/9.0.8/lib/<Platform>/<Arch>目录下。Platform代指本机系统,Arch代指要调试的Android的ABI。

3、编译项目时,需要添加调试信息,即在Android.mk中添加LOCAL_CFLAGS += -g,或者通过在ndk-build命令行上传递NDK_DEBUG=1。同时如果项目的Application.mk文件指定APP_OPTIM设置,必须将其设置为debug以禁用编译器优化。

调试设置

1、VS Code中打开需要调试的项目,点击运行>>启动调试(或直接按F5快捷键)。

选择环境

在弹出的窗口中选择LLDB,若无此选项请检查CodeLLDB extension是否安装。

第一次没有配置文件时,会弹出如下窗口,点击确认,将会在当前项目中.vscode中生成默认的launch.json文件。

确定

2、launch.json的设置属性如下所述。

name:调试配置的名字,在进行调试时,根据名字选择不同的配置。
type: 设置为"lldb",表示使用CodeLLDB extension提供的lldb进行调试。
program:要调试的程序。这应该指向带有调试符号的可执行文件的本地版本(非剥离版本),通常在项目的构建目录下的obj/local/armeabi-v7a中(对于64位构建,则位于obj/local/arm64-v8a中)。
request:分为attach和launch。
preLaunchTask:在启动调试器之前要执行的任务。
initCommands:初始化时相关的参数。

更多相关信息,请参考 vscode-lldb/MANUAL.md。

示例launch.json文件:

{"version": "0.2.0","configurations": [{"type": "lldb","request": "attach","name": "lldb attach","program": "${workspaceFolder}/test","preLaunchTask": "lldb build task","initCommands": ["platform select remote-android","platform connect connect://localhost:9090","settings set target.inherit-env false",],},{"type": "lldb","request": "launch","name": "lldb launch","program": "${workspaceFolder}/test","preLaunchTask": "lldb build task","initCommands": ["platform select remote-android","platform connect connect://localhost:9090","settings set target.inherit-env false","platform settings -w /data/local/tmp/","platform status"],},]
}

3、前面提到preLaunchTask任务,这些任务也可以用于支持调试。可以定义一个任务来编译代码,push程序到手机端,转发调试器端口等操作。
在.vscode中添加一个tasks.json文件。如下:

{"version": "2.0.0","tasks": [{"label": "build task","type": "shell","command": "source debug.sh"}]
}

注意task中"label"的值和launch中"preLaunchTask"的值一致。这里我们执行一个shell命令,将具体的任务放在debug.sh中处理。有关任务配置的更多信息,请参见VSCode文档。

4、在项目中新建debug.sh文件,内容如下:

#!/bin/bashndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=./Application.mk APP_BUILD_SCRIPT=Android.mk cleanndk-build NDK_DEBUG=1 NDK_PROJECT_PATH=. NDK_APPLICATION_MK=./Application.mk APP_BUILD_SCRIPT=Android.mk -j16adb push obj/local/arm64-v8a/test /system/bin/
adb shell chmod 777 /system/bin/testadb forward tcp:9090 tcp:9090gnome-terminal -- bash -c "adb shell '/data/local/tmp/lldb-server platform --listen *:9090 --server'"

a、首先使用ndk-build编译代码,里面增加了NDK_DEBUG=1,使其生成的程序包含调试信息;再将生成的程序push到/system/bin/目录下,同时赋予可执行权限。

b、设置端口转发
在开发机上设置端口转发,命令如下:

adb forward tcp:9090 tcp:9090

命令说明:表示通过adb映射tcp端口1234,命令中前面的是local的端口,后面的是remote的端口。命令中的端口号必须与lldb-server命令中的监听端口号相同,否则会导致lldb无法与lldb-server连接。

c、在目标设备上执行lldb-server

adb shell "/data/local/tmp/lldb-server platform --listen '*:9090' --server &" &

更多介绍可以查看lldb官方文档The LLDB Debugger。

启动调试

一切准备ok,接下可以开始调试了,在选择配置时可以选择lldb attachlldb launch,根据实际使用情况选择不同模式。
三种方式启动:
1、通过单击VS Code窗口左侧的Debug图标,启用“开始调试”面板;
2、从面板顶部的列表中选择“运行”,然后单击执行“启动调试”按钮;
3、直接快捷键F5。

一旦调试器开始连接,VSCode调试控制台将显示来自调试器的消息,并在必要时允许执行手动调试器命令(必须停​​止程序以执行调试命令)。调试面板将显示调试信息(变量监视,调用堆栈,断点等),调试器工具栏将提供对常见调试命令的访问。还支持基于鼠标光标的变量显示。

在这里插入图片描述

这篇关于使用LLDB在VS Code中调试Android C_C++代码(无需Android源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012582

相关文章

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Spring Boot中WebSocket常用使用方法详解

《SpringBoot中WebSocket常用使用方法详解》本文从WebSocket的基础概念出发,详细介绍了SpringBoot集成WebSocket的步骤,并重点讲解了常用的使用方法,包括简单消... 目录一、WebSocket基础概念1.1 什么是WebSocket1.2 WebSocket与HTTP

C#中Guid类使用小结

《C#中Guid类使用小结》本文主要介绍了C#中Guid类用于生成和操作128位的唯一标识符,用于数据库主键及分布式系统,支持通过NewGuid、Parse等方法生成,感兴趣的可以了解一下... 目录前言一、什么是 Guid二、生成 Guid1. 使用 Guid.NewGuid() 方法2. 从字符串创建

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四