使用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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听