[√]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
目录
相关文章
|
20天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
2月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
51 2
|
28天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
53 15
Android 系统缓存扫描与清理方法分析
|
1月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
1月前
|
编译器 Android开发
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
配置环境变量,使CMakeLists.txt可直接使用Android NDK工具链编译项目
|
2月前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
141 3
|
1月前
|
开发工具 Android开发 Swift
安卓与iOS开发环境的差异性分析
【10月更文挑战第8天】 本文旨在探讨Android和iOS两大移动操作系统在开发环境上的不同,包括开发语言、工具、平台特性等方面。通过对这些差异性的分析,帮助开发者更好地理解两大平台,以便在项目开发中做出更合适的技术选择。
|
2月前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
2月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
在Android应用开发中,追求卓越性能是不变的主题。本文介绍如何利用Android NDK(Native Development Kit)结合Java与C++进行混合编程,提升应用性能。从环境搭建到JNI接口设计,再到实战示例,全面展示NDK的优势与应用技巧,助你打造高性能应用。通过具体案例,如计算斐波那契数列,详细讲解Java与C++的协作流程,帮助开发者掌握NDK开发精髓,实现高效计算与硬件交互。
138 1
|
2月前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
本文将探讨安卓和iOS这两大移动操作系统在开发环境上的差异,从工具、语言、框架到生态系统等多个角度进行比较。我们将深入了解各自的优势和劣势,并尝试为开发者提供一些实用的建议,以帮助他们根据自己的需求选择最适合的开发平台。
49 1