Android Native开发系列之C/C++代码调试

news2024/11/19 20:22:19

Android Native开发系列之C/C++代码调试

在这里插入图片描述

引言

在做Android native层开发的时候,需要经常调试C/C++代码,相较而言通过打日志的方式太不方便了。有两种方式可以进行底层代码的调试。

  1. 利用Android studio自带的Debugger进行调试。
  2. 利用LLDB + VSCode进行代码调试。

第一种方式,适合公司内部的开发环境下使用,第二种方式适合在与客户联调时使用。

例如客户使用我们sdk的过程中遇到了问题,因为没法完整模拟客户的使用场景,不好排查问题,那我们这边需要源码断点调式时,可以给客户一个包含debug信息的so,客户集成后,编译一个apk给我们。我们就可以利用这个apk,进行源码调试。

Android Studio Debugger

先说简单的,拿ndk-sample里的native-codec工程做例子。在需要调试的代码处,打断点,然后直接点debug调试按钮即可。

这里需要注意的是Debug Type 需要选择正确的模式。

  • Java Only
  • Native Only
  • Java+Native
  • Detect Automatically

更改Debug Type模式的方式:点击 Run->Editor Configurations… 进入如下界面。

成功后的效果图:

不过,经过我的经验发现,这样做不是很保险,有时候会出现debug失败的情况,会出现找不到so的信息,保险起见的做法是在Run/Debug Configurations页面中,加入Symbol Directories信息,指明so路径。

上面的页面可以用快捷键打开:control+option+D(Mac) / Alt+Shift+F9(Windows)

LLDB Startup CommandsLLDB Post Attach Commands 选项可以用到设置LLDB命令,设置的LLDB命令会在对应的时机触发。关于lldb具体有哪些命令,大家可以查询相应文档。

LLDB Commands

从这里也能看出,AS的debug能力是利用LLDB实现的。这里在调试完之后,可以看下data/data/包名 目录下的文件,我们发现,利用as调试后,包的内部存储下会多一个lldb目录,里面包含lldb-server和一个shell脚本。关于shell脚本内容,大家可以自己实操看下,我们后面利用vscode+lldb的调试,也是这样做的。

VSCode+LLDB

准备工作

这种方式,本质上是跟AS一样的,首先我们需要VSCode IDE,接着需要安装lldb的插件,插件:CodeLLDB插件 ,这里可以先安装最新版本,如果不能用再安装1.7.2版本。

因为我分别在windows环境和mac环境尝试过,在Mac环境用最新的插件版本没问题,Windows环境最新版本有问题,用1.7.2版本功能正常,应该是lldb的版本不一致导致的,会debug失败。

接着我们需要一个lldb-server,用来配置服务端环境,lldb-server从ndk里拿。这里可以看一下上一节末尾提到的lldb目录。

接着分别配置服务端和客户端环境。

服务端

需要把lldb-server 上传到apk,data/data目录下。

  1. adb push ***/lldb-server /sdcard/
  2. adb shell mv /sdcard/lldb-server /data/local/tmp/
  3. adb shell chmod 777 /data/local/tmp/lldb-server
  4. adb shell run-as packageName mkdir test
  5. adb shell run-as packageName cp /data/local/tmp/lldb-server test/lldb-server
  6. adb shell run-as packageName ./test/lldb-server platform --server --listen unix-abstract:///data/local/tmp/debug.sock ///启动server

上面的操作步骤可以封装到脚本里面去做。

客户端

vscode 配置:

打开.vscode/launch.json,修改pid信息,pid获取方式: adb shell pidof “包名”

点击运行和调试,运行Android So Debug任务。

效果:

参考链接

https://lldb.llvm.org/use/remote.html

https://blog.xhyeax.com/2022/05/06/debug-android-by-gdb-and-lldb/

https://stackoverflow.com/questions/53733781/how-do-i-use-lldb-to-debug-c-code-on-android-on-command-line

https://github.com/vadimcn/vscode-lldb/blob/v1.7.4/MANUAL.md

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

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

相关文章

SAP灵活工作流条件增强

前置 灵活工作流模板中可以设置条件,用来在场景配置中判断是否启动流程或者是否执行该节点 除了流程模板中设置,也可以通过增强设置更为灵活的条件判断,对应增强点SWF_PROCESS_WORKFLOW_CONDITION 增强实施步骤参考 创建增强点实施 复制示例类 为增强设…

深入聊一聊vue3中的reactive()

在vue3的开发中,reactive是提供实现响应式数据的方法。日常开发这个是使用频率很高的api。这篇文章笔者就来探索其内部运行机制。小白一枚,写得不好请多多见谅。 调试版本为3.2.45 什么是reactive? reactive是Vue3中提供实现响应式数据的方法. 在Vue2中…

【Dash搭建可视化网站】项目9:智能选股器(结合行业、换手率、量比与60日k线图选择目标股票)制作步骤详解

【Dash搭建可视化网站】项目9:智能选股器(结合行业、换手率、量比与60日k线图选择目标股票)1 项目效果图2 项目架构3 文件介绍和功能完善3.1 assets文件夹介绍3.2 app.py和index.py文件完善3.3 layoutleft.py文件完善3.4 api.py和api.ipynb文…

【数据结构趣味多】栈和队列(详细解析)

目录 1.1 栈的定义 1.2 栈的模拟实现(顺序栈) push()方法 pop()方法 peek()方法 size()方法 栈模拟实现的全代码 1.3顺序栈和链栈的对比 2.队列 2.1队列的定义 2.1队列的模拟实现(单链表) offer()函数 poll()函数 p…

ABB AC500 PLC 与西门子 S7-300 CPU DP 通讯

硬件连接 将一个 AC500 CPU(本例 PM583) 左侧插入以 DP 通讯扩展模块 CM572,使用 DP 通讯电缆连接 CM572 与 314-2DP CPU 的 DP 通讯口。连接示意图如下: AC500 DP 主站配置 安装 DP 从站设备描述文件 从西门子官方网站下载 CP…

认识二叉树

hi,代噶候。今天带大家认识一下二叉树,这个二叉树在我看来确实很有难度,但是不要怕,,鲁迅先生曾经说过,真正的勇士敢于面对惨淡的人生,敢于正视淋漓 的鲜血,下面让我们开始吧&#x…

线程池的内部结构与原理解析

线程池的内部结构 使⽤线程池的原因: 1、降低资源消耗 2、控制并发的数量。并发数量过多,可能会导致资源消耗过多,从⽽造成服务器崩溃 3、提高线程的可管理性 1、线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源&…

Global Illumination_SDF Generate Visualize Shadow

Signed Distance Field(有向距离场),简称SDF,这其实是图形学中非常常用的数学概念。数学上来说,是定义在空间中的一个标量场,标量值为空间一点到曲面的距离。曲面外的点为正值,曲面上的点为0,曲面内的点为负…

通用vue组件化展示列表数据

一、数据的简单展示 1.首先先确定要展示的表格列名以及拿到所需要展示的数组数据 2.然后建立一个专门放el-table遍历的文件 3.在父组件中将数据列表数据存放在listData里面,然后传给子组件,子组件定义一个动态的列,通过遍历propList得到列名…

SpringCloud从入门到精通(八)

config config-概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护。 • 好处: 集中管理配置文件 不同环境不同配置,动态化的配置更新 配置信息改变时,不需要重启即可更新配置信息到服务config-快速入门 gitee搭…

一文告别结合Nacos后,Springboot的配置文件看不懂的痛苦

一、背景 后端基于SpringCloud项目架构的话,默认会使用Nacos来做配置中心,但是这对从来没接触过Nacos配置中心的小伙伴,肯定就不知道怎么回事了,于是便有了这一篇指引。 二、Nacos配置中心是如何引入SpringCloud项目中的呢&…

操作系统实验8:proc文件的实现

实验目的 掌握虚拟文件系统的实现原理实践文件、目录、索引节点等概念 实验内容 在Linux 0.11上实现procfs(proc文件系统)内的psinfo结点。当读取此结点的内容时,可得到系统当前所有进程的状态信息。例如,用cat命令显示/proc/p…

有限状态机

文章目录1.概念2.什么是计算3.什么是有限状态机3.1特性3.2为什么要用状态机4.实战4.1字符串转换整数4.2用有限状态机实现4.3源码1.概念 有限状态机(英语:finite-state machine,缩写:FSM)又称有限状态自动机&#xff0…

【手写 Vue2.x 源码】第十篇 - 数组数据变化的观测情况

一,前言 上篇,主要介绍了对象数据变化的观测情况,涉及以下几个点: 实现了对象老属性值变更为对象、数组时的深层观测处理; 结合实现原理,说明了对象新增属性不能被观测的原因,及如何实现数据…

综合案例二 旅游网【1.项目导入技术选型注册表单校验登录退出表单】注册表空指针异常和其他一些错误

目录 前提:项目导入 在maven中点击travel项目(这里我是将项目添加到hello_maven里 ) 1.启动项目 方式一:maven命令启动 方式二:配置maven快捷启动 2.技术选型 1 Web层 2 Service层 3 Dao层 3.创建数据库…

56/14 shell脚本 后台启动 程序1 + “tail -f log“, ctrl +c 导致程序1中断

前言 接上一篇文章, node 程序后台执行加上 tail 命令, 中断 tail 命令, 同时也中断了 node 程序 我们来详细 参照对比一下 这个问题的各种情况 主要的脚本如下类似, 第一条命令 后台启动 程序1, 然后 第二条命令 tail -f 查看日志 然后 ctrlc 中断 "tail -f" …

实现自己的打印函数

文章目录前言前置知识代码说明实验操作单字符打印字符串打印整形字符串打印前言 本博客记录《操作系统真象还原》第六章实验的操作~ 实验环境:ubuntu18.04VMware , Bochs下载安装 实验内容: 实现 put_char 单字符打印输出函数。实现 put_…

TEE 背景知识

TEE 背景 计算机世界的安全,是保护计算机系统和网络免受攻击者的攻击,这些攻击可能导致未经授权的信息泄露、窃取或损坏硬件、软件或数据,以及它们所提供的服务的中断或误导。更多参考 Computer_security 1 安全是什么 谈安全,…

28.0:Combit LIST LABEL Reporting for Delphi Crack

作为 Delphi 开发人员的优势: 将 VCL 组件直接集成到 Embarcadero IDE 中 免版税报表设计器 交互式预览等 使用综合报表对象 Delphi 和所有其他相关语言和开发环境的报告工具。 将列表和标签集成到 Embarcadero RAD Studio List & Label 的 VCL 组件编译并直接…

HTML与CSS基础(八)—— CSS布局(定位、装饰、选择器拓展)

目标能够说出 定位 的常见应用场景 能够说出 不同定位方式 的特点 能够使用 子绝父相 完成元素水平垂直案例 能够写出三种常见的 光标类型(cursor) 能够使用 圆角边框 属性完成 正圆 和 胶囊按钮 效果 能够说出 display 和 visibility 让 元素本身隐藏 的…