嵌入式安卓开发使用LLDB进行断点调试C/C++代码

news/2024/11/19 21:24:20/文章来源:https://www.cnblogs.com/chenshao107/p/18548660

GDB or LLDB?

较新的安卓NDK已经没有包括gdbserver了,而且安卓官网也说了,后续不会支持gdb了。我自己之前费了很大的功夫,去交叉编译一个gdbserver,但最后用起来一大堆莫名其妙的问题。所以还是使用LLDB吧。

获取相应的工具

https://developer.android.google.cn/ndk/downloads
这里下载NDK,直接下载最新版就好(太旧的安卓版本可以适当降低ndk的版本?)。解压之后在里面找到对应平台的lldb-server,将这个二进制文件adb push进去就行了。

生成带有调试信息的程序或者库

需要添加调试信息,即在Android.mk或者bp中添加LOCAL_CFLAGS += -g,或者通过在ndk-build命令行上传递NDK_DEBUG=1。或者在cppflags里添加"-g","-O0"选项。然后编译即可。注意这里无论是so库,还是可执行文件,只要是想断点调试的源码都必须要附带调试信息。

启动lldb-server

lldb-server platform --server --listen *:12345
这里比较需要注意的是,尽量在一个可读文件系统并且有较大权限的里执行,因为lldb与lldb-server连接时,有可能需要将一些可执行二进制文件push进去,并执行,如果文件系统不对的话,有可能会出现无论怎么样chmod +x都无法添加执行权限(比如sdcard)。可以试试cache文件夹。

CodeLLDB插件

搜索下载vscode插件 CodeLLDB。

launch.json

进入vscode调试界面,点击创建一个launch.json文件,已有launch.json文件的话,可以点击小齿轮,编译它。
例子如下

{"configurations": [{"name": "Remote launch","type": "lldb","request": "attach","program": "out/soong/.intermediates/external/libhiddroid/test/test_demo/android_arm64_armv8-a/unstripped/test_demo", // Local path."initCommands": ["platform select remote-android", // For example: 'remote-linux', 'remote-macosx', 'remote-android', etc."platform connect connect://172.20.11.154:12345","settings set target.inherit-env false", // See note below."platform process list"],"pid": "5262","env": {"PATH": "...", // See note below.},}],}

开始调试

然后点击绿色小三角就可以进行打断点调试了。
推荐直接使用attach,因为就算直接调试可执行二进制文件,也可以多开一个终端执行它,还可以方便输入信息来响应程序,然后找到pid,进行attach即可。
attach成功后,就可以开始调试了。可执行二进制内的符号一般是直接加载好的,(没有的话可以在调试控制台执行file 源码.cpp)。但其链接的动态库,需要手动file命令来加载符号。你也可以将这些file命令添加进initCommands里。

BUG

事情一般不会过于顺利。
如果你使用LLDB调试时,发现基本全都是汇编代码,即使是使用了file命令,也没办法看见c/c++代码,打断点也停不下来,那说明编译出来的文件调试信息出问题了。

dwarf版本

如果报的错有关dwarf版本的话,一般可能是dwarf版本过高,lldb/gdb无法支持什么的。只要下的nkd比较新,一般不会报这种错。这里可以使用objdump --dwarf=info 二进制文件来查看dwarf的一些信息。也可以添加一些flag比如-gdwarf-4来限制dwarf版本。(记得,参与链接编译的都要加这个)。但一般还是推荐更新LLDB工具,尽量使用高版本的dwarf。

调试信息不对劲

使用objdump -g 二进制文件来查看调试信息。如果输出的内容非常多,甚至溢出终端的屏幕,那说明一般没问题,如果比较少,而且内容看起来信息熵很小,那多半出问题,这种情况可能会导致调试时只能看到汇编代码。
这种情况首先就是去排查是否添加了-g -O0等等flag。可以对编译的工具链添加-v参数,让每条编译指令都答应出来。或者编译项目时,太难去找哪条编译指令的话,可以尝试添加一些必定会报错的flag。比如-jjjjjjjjjjjjjjjjjjjjjj,这样就可以看看有没有这些参数。
在确定有这些参数,而且过后没有什么流程去strip的话,那就可以怀疑一下,编译使用的工具链了。有些厂商会使用一些自己魔改过的编译链工具,如果编译的源码比较少的话,你可以使用上述方法截取出命令自行替换工具链。编译文件多的话……我暂时也想不到什么好办法。

自己自行替换了工具链,进行编译、链接(链接的命令可以添加必定会报错的LDFLAGS,截取出来)后,使用objdump -g 二进制文件查看,如果信息很多的话,一般就没问题了。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

接口测试之fiddler(10.2)

一、fiddler包安装 路径也尽量不要有中文安装步骤:略 二、Fiddler 简介 fiddler 是 C# 开发免费web调试工具之一,记录所有客户端和服务端常见的 http 以及 https 请求,可监视设断点,甚至修改输入输出数据,它还包含了一个强大的基于事件脚本的子系统,并且能使用 .net 语言…

JDK21新增特性

顺序集合(Sequenced Collections)提供了几个新的接口,用于实现有序的集合。在没有提供有序集合操作之前,我们进行集合的序列操作一般如下First element Last elementList list.get(0) list.get(list.size() - 1)Deque deque.getFirst() deque.getLast()SortedSet sortedSet.f…

NOIP2024加赛6

让人家来打模拟赛,被吊打了吧。一签三计数,罚坐了。 草莓 简单贪心,随便贪就过了。点此查看代码 #include<bits/stdc++.h> using namespace std; #define rep(i,s,t,p) for(int i = s;i <= t;i += p) #define drep(i,s,t,p) for(int i = s;i >= t;i -= p) #ifde…

java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法

java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法@目录一、记录文件相关操作方法二、代码1.读取路径返回List<File>2.读取路径返回List<String>3.删除文件夹4.删除文件 一、记录文件相关操作方法 二、代…

一些再也不敢了的行为

前言:考完 CSP-S 2024 才总结出来的各种离谱错误。本文不讨论类似于在有环图上跑拓扑排序这种错误,直接说会见祖宗的行为。进入考场前检查好准考证和身份证等必要物品,笔者因为这个原因 \(2024\) 年联合省选被困在了门外。由于不是正式选手,最终被放了进去。如果当前电脑运…

什么是水鱼?三分钟教会你

"水鱼"是广西人最喜欢玩的酒桌游戏,它属于扑克牌的一种玩法,经过不断改良升级而来。如果你在广西不会水鱼,那喝酒就没有了灵魂。虽然广西名族很多,水鱼玩法不一样,但是同一个框架,内容不同而已。比如有些地方黑桃花色最大,有些地方红桃花色最大,这种一般玩2,…

Oracle Linux 9.5 正式版发布 - Oracle 提供支持 RHEL 兼容发行版

Oracle Linux 9.5 正式版发布 - Oracle 提供支持 RHEL 兼容发行版Oracle Linux 9.5 正式版发布 - Oracle 提供支持 RHEL 兼容发行版 Oracle Linux with Unbreakable Enterprise Kernel (UEK) & Red Hat compatible kernel (RHCK) 请访问原文链接:https://sysin.org/blog/o…

List集合按照由小到大排序或者由大到小排序

@目录背景原代码由小到大排序由大到小排序 背景原List<User>里面是无序的,比如从redis查找等情况,查出来的是无序的,现在想按照由小到大排序或者由大到小排序。原代码 List<User> list = new ArrayList<>(); list.add(new User(3, "c", new Dat…

pta两次大作业

PTA 两次大作业总结:详细分析与实践经验 前言 回顾这次的家具强电电路模拟程序大作业,它无疑是一次极具挑战的编程与设计经历。从最初简单的电路组件模拟,到后期复杂的多设备连接和精准的控制反馈,这个过程不仅让我掌握了许多技术技能,还在思维方式、问题解决能力以及系统…

mac安装maven3.8.8

问题描述 down了一个新应用, maven依赖总是加载不到, 本地仓库也能找到, 项目启动报错 org.apache.skywalking:apm-toolkit-trace:pom:5.0.0-RC-SNAPSHOT failed to transfer from http://0.0.0.0/ during a previous attempt. This failure was cached in the local repositor…

mac 安装maven

问题描述 down了一个新应用, maven依赖总是加载不到, 本地仓库也能找到, 项目启动报错 org.apache.skywalking:apm-toolkit-trace:pom:5.0.0-RC-SNAPSHOT failed to transfer from http://0.0.0.0/ during a previous attempt. This failure was cached in the local repositor…

一个基于 .NET 8.0 构建的简单、跨平台、模块化商城系统

前言 今天给大家分享一个基于 .NET 8.0 构建的开源免费(MIT License)、简单、跨平台、模块化的商城系统:Module Shop。 主要功能销售:订单、物流。 内容:首页配置、评论、回复。 配置:国家、用户、仓库、运费、高级设置。 商品:分类、品牌、单位、选项(销售属性)、属性…