[√]Android NDK调试启动分析LLDB-SERVER

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: [√]Android NDK调试启动分析LLDB-SERVER

有时使用AndroidStudio调试c++代码时,无法正确的命中代码,观察到AndroidStudio的控制台输出了一些命令:

Launching 'client_tank2018' on Xiaomi Redmi Note 8 Pro.
# adb通过am启动app
$ adb shell am start -n "com.caohua.tank5/org.cocos2dx.lua.AppActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -D
Waiting for application to come online: com.caohua.tank5.test | com.caohua.tank5
Connecting to com.caohua.tank5
Now Launching Native Debug Session
$ adb shell 
    # | 用于将一个命令的输出作为另一个命令的输入
    cat /data/local/tmp/lldb-server | 
    # run-as以应用程序的上下文身份运行命令,这样就能够访问应用程序的私有文件和目录
    # sh -c 是在shell中执行一串字符串命令
    # && 是一个逻辑与操作符,用于在前一个命令成功执行后才执行后续的命令
    run-as com.caohua.tank5 sh -c 'cat > /data/data/com.caohua.tank5/lldb/bin/lldb-server && 
    # 700 表示用户具备读取、写入和执行权限
    chmod 700 /data/data/com.caohua.tank5/lldb/bin/lldb-server' 
$ adb shell 
    cat /data/local/tmp/start_lldb_server.sh | 
    run-as com.caohua.tank5 sh -c 'cat > /data/data/com.caohua.tank5/lldb/bin/start_lldb_server.sh && 
    chmod 700 /data/data/com.caohua.tank5/lldb/bin/start_lldb_server.sh'
# 运行lldb脚本   
Starting LLDB server: /data/data/com.caohua.tank5/lldb/bin/start_lldb_server.sh 
    /data/data/com.caohua.tank5/lldb 
    unix-abstract 
    /com.caohua.tank5-0 
    platform-1689041457869.sock 
    "lldb process:gdb-remote packets"
Debugger attached to process 16700
Timed out waiting for java debugger to attach

2个shell命令的作用:将系统目录的lldb-serverstart_lldb_server.sh拷贝到app内

image.png

  • start_lldb_server.sh
#!/system/bin/sh
# This script launches lldb-server on Android device from application subfolder - /data/data/$packageId/lldb/bin.
# Native run configuration is expected to push this script along with lldb-server to the device prior to its execution.
# Following command arguments are expected to be passed - lldb package directory and lldb-server listen port.
umask 0002
LLDB_DIR=$1          # /data/data/com.caohua.tank5/lldb 
LISTENER_SCHEME=$2   # unix-abstract 
DOMAINSOCKET_DIR=$3  # /com.caohua.tank5-0 
PLATFORM_SOCKET=$4   # platform-1689041457869.sock 
LOG_CHANNELS=$5      # "lldb process:gdb-remote packets"
BIN_DIR=$LLDB_DIR/bin
LOG_DIR=$LLDB_DIR/log
TMP_DIR=$LLDB_DIR/tmp
PLATFORM_LOG_FILE=$LOG_DIR/platform.log
export LLDB_DEBUGSERVER_LOG_FILE=$LOG_DIR/gdb-server.log
export LLDB_SERVER_LOG_CHANNELS="$LOG_CHANNELS"
export LLDB_DEBUGSERVER_DOMAINSOCKET_DIR=$DOMAINSOCKET_DIR
# This directory already exists. Make sure it has the right permissions.
#   所有者拥有读、写和执行权限;
#   所属组拥有读和执行权限;
#   其他用户拥有读和执行权限。
chmod 0775 "$LLDB_DIR"
# 清空tmp、log目录
rm -r $TMP_DIR
mkdir $TMP_DIR
export TMPDIR=$TMP_DIR
rm -r $LOG_DIR
mkdir $LOG_DIR
# LLDB would create these files with more restrictive permissions than our umask above. Make sure
# he doesn't get a chance.
# "touch" does not exist on pre API-16 devices. This is a poor man's replacement
cat </dev/null                     # 将标准输入重定向为特殊设备文件,/dev/null表示不接收任何输入
    >"$LLDB_DEBUGSERVER_LOG_FILE"  # 重定向标准输出 log/gdb-server.log
    2>"$PLATFORM_LOG_FILE"         # 重定向错误输出 log/platform.log
cd $TMP_DIR # change cwd
$BIN_DIR/lldb-server 
    # 指定 `lldb-server` 运行在平台模式下,用于与调试目标进行通信
    platform 
        # 以服务器模式运行 `lldb-server`
        --server  
        # 指定 `lldb-server` 监听的地址和端口
        #     `$LISTENER_SCHEME` 是监听方案(如 `unix-abstract` 或 `tcp`)
        #     `$DOMAINSOCKET_DIR` 是 Unix 域套接字目录路径
        #     `$PLATFORM_SOCKET` 是套接字名称。 
        # unix-abstract:///com.caohua.tank5-0/platform-1689041457869.sock
        --listen $LISTENER_SCHEME://$DOMAINSOCKET_DIR/$PLATFORM_SOCKET 
        # log/platform.log
        --log-file "$PLATFORM_LOG_FILE" 
        # "lldb process:gdb-remote packets"
        --log-channels "$LOG_CHANNELS" 
    </dev/null                    # 不接受任何输入
    >$LOG_DIR/platform-stdout.log # 标准输出
    # 标准输入的文件描述符为 0,标准输出的文件描述符为 1,标准错误输出的文件描述符为 2
    2>&1                          # 错误输出,&1的意思是合并标准错误和标准输出,并输出到日志文件中

log-channels

lldb.llvm.org/man/lldb-se…

每个通道以冒号分隔,每个通道所包含的channel一个空格分隔

  • default:默认通道,输出默认的日志信息。
  • gdb-remote:输出与 gdb 远程调试相关的日志信息。
  • process:输出与进程和线程相关的日志信息。
  • breakpoint:输出与断点相关的日志信息。
  • packet:输出与数据包交换相关的日志信息。
  • communication:输出与通信相关的日志信息。
  • event:输出与事件相关的日志信息。
  • platform:输出与平台相关的日志信息。
  • command:输出与命令执行相关的日志信息。
  • expression:输出与表达式求值相关的日志信息。
  • unwind:输出与栈展开相关的日志信息。
  • image.png
  • channel1: lldb process
  • channel2: gdb-remote packets

lldb-server

LLDB 是一个用于C、C++等语言的调试器,可以帮助开发人员进行调试和分析代码,lldb-server 是调试器的服务器组件,用于与调试目标进行通信和远程调试。

./lldb-server  help
Usage:
  ./lldb-server v[ersion]
  ./lldb-server g[dbserver] [options] # 用于在目标设备上启动 lldb 服务器,并等待本地调试器连接
  ./lldb-server p[latform] [options]  # 用于从本地调试器连接到已经运行的 lldb 服务器

unix-abstract

unix-abstract 是一种网络连接方案,用于在 Unix 系统上进行本地通信。与传统的 TCP/IP 或 Unix 域套接字不同,unix-abstract 方案使用一个抽象命名空间来创建套接字。

--listen $LISTENER_SCHEME://$DOMAINSOCKET_DIR/$PLATFORM_SOCKET 中,$LISTENER_SCHEME 可以被设置为 unix-abstract,以指定 lldb-server 监听在一个抽象命名空间的 Unix 域套接字上。这样,套接字名称 $PLATFORM_SOCKET 将在该抽象命名空间中创建,而不是在文件系统中创建相应的套接字文件。

使用 unix-abstract 方案可以提供更高的安全性和隔离性,因为套接字名称不会暴露在文件系统中,并且只能通过本地进程间通信来访问。这对于需要在本地进行通信而又希望保持较高安全性的场景非常有用。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
27天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
34 2
|
2月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
52 0
|
8天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
|
15天前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
15天前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
58 1
|
1月前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
本文将探讨安卓和iOS这两大移动操作系统在开发环境上的差异,从工具、语言、框架到生态系统等多个角度进行比较。我们将深入了解各自的优势和劣势,并尝试为开发者提供一些实用的建议,以帮助他们根据自己的需求选择最适合的开发平台。
29 1
|
2月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,Android和iOS两大平台各自占据着重要的位置。本文将深入探讨这两种操作系统的开发环境,从编程语言到开发工具,从用户界面设计到性能优化,以及市场趋势对开发者选择的影响。我们旨在为读者提供一个全面的比较视角,帮助理解不同平台的优势与挑战,并为那些站在选择十字路口的开发者提供有价值的参考信息。
|
2月前
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
86 0
安卓系统调试与优化:(一)bootchart 的配置和使用
|
2月前
|
开发框架 Android开发 Swift
安卓与iOS应用开发对比分析
【8月更文挑战第20天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。本文将深入探讨这两大操作系统在开发环境、编程语言、用户界面设计、性能优化及市场分布等方面的差异和特点。通过比较分析,旨在为开发者提供一个宏观的视角,帮助他们根据项目需求和目标受众选择最合适的开发平台。同时,文章还将讨论跨平台开发框架的利与弊,以及它们如何影响着移动应用的开发趋势。
|
2月前
|
安全 搜索推荐 Android开发
安卓与iOS应用开发的对比分析
【8月更文挑战第20天】在移动应用开发领域,安卓和iOS两大平台各领风骚。本文通过深入探讨两者的开发环境、编程语言、用户界面设计、应用市场及分发机制等方面的差异,揭示了各自的优势和挑战。旨在为开发者提供决策支持,同时帮助理解为何某些应用可能优先选择在一个平台上发布。
30 2
下一篇
无影云桌面