当前位置: 首页 > news >正文

Android 原生程序使用gdb, addr2line, readelf调试

Platform: RK3368

OS: Android 6.0

Kernel: 3.10.0


文章目录

  • 一 gdb
    • 1. 原生程序添加调试符号
    • 2. 主机上adb push 编译好的原生程序到设备
    • 3. 设备上使用gdbserver运行原生程序
    • 4. 主机上设置adb端口转发
    • 5. 主机上运行gdb调试
  • 二 addr2line
  • 三 readelf

一 gdb

GDB(GNU Debugger)是GNU项目调试器,是一种强大的程序调试工具,可以用于调试C、C++、Fortran等多种编程语言编写的程序。它允许程序员在程序运行时监视程序的内部状态和程序的控制流程。

1. 原生程序添加调试符号

在原生程序的Android.mk中添加以下内容:

# 添加调试符号  
LOCAL_CFLAGS += -g -O0  # 不剥离符号  
LOCAL_STRIP_MODULE := false  

2. 主机上adb push 编译好的原生程序到设备

$ adb push out/target/product/$YOUR_DEVICE/system/bin/$YOUR_NATIVE_PROCESS

3. 设备上使用gdbserver运行原生程序

$ gdbserver :9090 /system/bin/$YOUR_NATIVE_PROCESS

4. 主机上设置adb端口转发

表示将本地9090端口转发到设备9090端口:

$ adb forward tcp:9090 tcp:9090

5. 主机上运行gdb调试

$ gdb out/target/product/$YOUR_DEVICE/system/bin/$YOUR_NATIVE_PROCESS
GNU gdb (Ubuntu 15.0.50.20240403-0ubuntu1) 15.0.50.20240403-git
Copyright (C) 2024 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:<http://www.gnu.org/software/gdb/documentation/>.For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from out/target/product/***/system/bin/****...
(gdb) target remote :9090
Remote debugging using :9090
warning: while parsing target description (at line 1): Target description specified unknown architecture "arm"
warning: Could not load XML target description; ignoring
Reading /system/bin/linker64 from remote target...
warning: File transfers from remote targets can be slow. Use "set sysroot" to access files locally instead.
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0x00000000 in ?? ()

二 addr2line

addr2line用于将程序的地址(例如,崩溃报告中提供的地址)转换为文件名和行号。这对于调试和定位程序中的错误非常有用,尤其是在处理崩溃或异常行为时。

一般在Android源码中source build/envsetup.sh和lunch以后, 就会有很多工具可以直接使用了, 例如:

$ arm-linux-androideabi-addr2line -f -e $YOUR_NATIVE_PROCESS

如果是64位程序需要使用aarch64下面的工具链, 否则会出现"File format not recognized"

$ /prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/aarch64-linux-android-addr2line -e $YOUR_NATIVE_PROCESS

三 readelf

readelf是一个在Unix和类Unix系统上用于查看ELF(Executable and Linkable Format)文件信息的命令行工具。readelf能够显示ELF文件的各种信息,包括但不限于:

  • 文件头:描述ELF文件的总体信息,包括系统相关、类型相关、加载相关和链接相关等。
  • 程序头:包含程序执行时所需的各种段(segment)的信息。
  • 节头:描述ELF文件中各个节(section)的信息,节是ELF文件的基本组成部分。
  • 符号表:包含程序中定义的符号和引用的外部符号的信息。
    此外,readelf还支持查看动态节、调试信息、版本信息等。

例如查看符号表信息:

$ arm-linux-androideabi-readelf -s $YOUR_NATIVE_PROCESS
http://www.lryc.cn/news/460283.html

相关文章:

  • PHP 函数 func_num_args() 的作用
  • 深入解析单片机原理及其物联网应用:附C#示例代码
  • HTTP 和 WebSocket
  • 科技云报到:大模型时代下,向量数据库的野望
  • 贪吃蛇游戏(代码篇)
  • 数控走心机系统可以定制吗
  • PHP实现OID(Object identifier)的编码和解码
  • 架构设计笔记-12-信息系统架构设计理论与实践
  • 【Power Compiler手册】15.多角多模式设计中的功耗优化
  • 关于HalconDeeplearn中的语义分割的实现
  • 【STL】AVLTree模拟实现
  • 无极低码课程【tomcat部署windows环境厂家乱码处理】
  • 注册安全分析报告:惠农网
  • Qualitor checkAcesso.php 任意文件上传漏洞复现(CVE-2024-44849)
  • PHP-FPM和FastCGI
  • 【Linux快速入门(二)】Linux与ROS学习之编译基础(make编译)
  • jupyterlab的安装与使用攻略/包括汉化方法
  • std::list
  • opencv-rust 系列2: camera_calibration
  • JVM和GC案例详解
  • postgreSql下载安装
  • GPT-SOVIT模型部署指南
  • 怎么定时发朋友圈?
  • 如何利用phpstudy创建mysql数据库
  • 五、Linux之Vi和Vim编辑器
  • git删除错误的commit
  • 代码随想录算法训练营Day08 | 344.反转字符串、541. 反转字符串II、卡码网:54.替换数字
  • mysql锁之乐观锁、悲观锁、表锁、行锁、共享锁、排他锁
  • 【软件干货】Android应用进程如何保活?
  • neo4j部署保姆级教程