前言

aosp自带gdbclient.py脚本用于调试

kevin@kevin-GS60-2PL /mnt/2ffc0bac-5896-499a-9ae6-79e610162482/aosp $ gdbclient.py
usage: gdbclient.py [-h] [--adb ADB_PATH] [-a | -d | -e | -s SERIAL](-p PID | -n NAME | -r ...) [--port [PORT]][--user [USER]]
gdbclient.py: error: one of the arguments -p -n -r is required

-n 通过进程名来调试,-p 通过进程id来调试
虽然使用该脚本工具调试没有问题,但是操作上来说还是不如IDE来得直观方便快捷,所以就考虑使用IDE来进行的C/C++调试

AOSP的C/C++调试原理,就是在Android端运行gdbserver,然后PC端使用gdb通过tcp连接到gdbserver,所以只要知道原理,使用CLion也是可以进行调试的。使用其它的C/C++ IDE理论上也是可以进行调试的,我之所以选择CLion一是因为其跨平台,二是因为在Linux平台上目前个人认为最好用的C/C++ IDE了

CLion配置

1. 编写CMakeLists.txt

目前CLion只能识别CMake项目,所以为了使用CLion调试AOSP,需要编写CMakeList.txt。否则无法使用远程调试功能。
参考这篇博客Android Native C/C++ 使用CLion阅读/编译技巧

2. 导入Aosp项目,配置远程调试

导入aosp需要等待index完成。
然后就可以新建远程调试了

  1. 选择Edit Configurations
  2. 点击加号,然后选择GDB Remote Debug
  3. 按下图进行配置("/mnt/2ffc0bac-5896-499a-9ae6-79e610162482/aosp"这个是我Android源码的目录,将其替换成自己源码的目录即可)

    主要是设置调试符号所在目录,以及路径映射

3. 编写android_gdbserver脚本

~/script/start_android_gdb_server.sh

#!/usr/bin/env bash
gdbServerPid=`adb shell ps | grep gdbserver | awk '{print $2}'`if [[ "" != ${gdbServerPid} ]]; thenadb shell su -c "kill ${gdbServerPid}"
fiadb forward tcp:1234 tcp:1234if [[ `adb shell whoami` == 'root'  ]]; thenis_root=true
fiif [[ -n $1 ]]; thenappPid=`adb shell ps | grep ${1} | awk '{print $2}'`if [[ -n ${appPid} ]]; thenif [[ $is_root == true  ]]; thenadb shell gdbserver :1234 --attach ${appPid}elseadb shell su -c "gdbserver :1234 --attach ${appPid} "fielseecho "$1 进程没有启动!"fi
elseecho "请设置要调试的进程名(app的进程名是包名)。例如 $0 <process name>"
fi

通过软连接连接到 ~/bin目录下

ln -s ~/script/start_android_gdb_server.sh ~/bin/android_gdb_server

4. 调试

这里通过调试zygote来演示如何使用CLion调试

  1. 先停止zygote服务

    adb shell stop zygote
    
  2. 启动gdbserver
    kevin@kevin-GS60-2PL /mnt/2ffc0bac-5896-499a-9ae6-79e610162482/aosp $ android_gdb_server init
    Attached; pid = 1
    Listening on port 1234
    Remote debugging from host 127.0.0.1
  3. 点击调试按钮(右边绿色按钮)

    如下图表示连接成功
  4. 设置断点位置如下
    system/core/init/service.cpp

    bool Service::Start() {// Starting a service removes it from the disabled or reset state and// immediately takes it out of the restarting state if it was in there.flags_ &= (~(SVC_DISABLED|SVC_RESTARTING|SVC_RESET|SVC_RESTART|SVC_DISABLED_START));// Running processes require no additional work --- if they're in the// process of exiting, we've ensured that they will immediately restart// on exit, unless they are ONESHOT.if (flags_ & SVC_RUNNING) {//在这里断点return false;}...
    }
    
  5. 启动zygote服务
    adb shell start zygote
    
  6. 停止在断点处

常见问题解决

  1. 调试时变量显示 potimized out
    这是因为clang编译时默认会进行优化,可以在Android.dp的cppflags中加入-O0禁止优化,然后重新编译m -j8,重启模拟器再次执行调试就可以了。

搭建Android源码调试环境(三)——调试C/C++(使用CLion)相关推荐

  1. Ubuntu18.04搭建Android源码编译环境

    一.前言 使用Ubuntu18.04搭建Android源码的编译,本文是参考Android系统源码编译文章撰写的. 二.步骤 1.下载Android源码.Ubuntu环境搭建.git安装请参考其他文章 ...

  2. win10+ubuntu18.04搭建Android源码编译环境

    一.基本配置 本机硬件配置:cpu 4.0GHZ  6核12线程)+ RAM 32g ddr4 + 512G SSD(机械硬盘也行) 操作系统/软件环境配置:win10+VMware 16 + ubu ...

  3. ubuntu下android源码编译环境,ubuntu12.04 64位上搭建android源码编译环境

    1.首先替换源为163的源,默认源下载速度太慢 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup (备份下当前的源列表) sudo ...

  4. 从零开始搭建Ubuntu 环境下的Android 源码开发环境

    本文从一个干净的Ubuntu 10.04 操作系统出发,一步一步引导你搭建自己的基于eclipse IDE 的Android源码开发环境. 正文会包含一下这些内容: 获得源码 编译源码准备工作 编译工 ...

  5. Android源码编译环境搭建教程 (一) - Ubuntu系统构建

    Android源码编译环境搭建教程 (一) - Ubuntu系统构建 本教程为感兴趣的同学提供Android源码编译的环境搭建,当然这里都是基于windows系统,mac系统也差不多,将相应的软件替换 ...

  6. 【深入浅出 Yarn 架构与实现】1-2 搭建 Hadoop 源码阅读环境

    本文将介绍如何使用 idea 搭建 Hadoop 源码阅读环境.(默认已安装好 Java.Maven 环境) 一.搭建源码阅读环境 一)idea 导入 hadoop 工程 从 github 上拉取代码 ...

  7. Gitolite + repo 搭建安卓源码开发环境

    Gitolite + repo 搭建安卓源码开发环境 转载请注明出处:http://blog.csdn.net/u011479494/article/details/50629669 相比gitosi ...

  8. 【Android开发】构建Android源码编译环境

    原文:http://android.eoe.cn/topic/android_sdk 构建Android源码编译环境 123456789 10 11 12 13 14 15 16 17 18 $ su ...

  9. jdk javac运行不了_Intellij IDEA搭建jdk源码阅读环境

    一.找到源码位置 直接找到jdk安装的目录,会看到src.zip的压缩包,这里面就是jdk的源码,例如下图: 在这里解压. 第一次尝试建议使用9或更早版本jdk的源码,否则易造成卡死. 二.Intel ...

最新文章

  1. C# 2进制、8进制、10进制、16进制...各种进制间的轻松转换
  2. NFS 文件共享的创建过程
  3. Chrome检查更新总失败?安装细则讲解
  4. [转]使用jQuery.ajax傳送物件陣列給ASP.NET MVC
  5. Halcon 记录1
  6. js判断是微信、QQ内置浏览器打开页面
  7. (最优解)L1-028 判断素数 (10分)——17行代码AC
  8. 来自Yang Terry的关于SAP CRM One Order事件回调机制的分享
  9. 动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割
  10. C++(23)--多态性与虚函数
  11. SpringMVC对日期类型的转换
  12. SQL Server 2005高可用性之镜像功能
  13. 国内外cms网站大全
  14. java 实现宠物领养_基于jsp的宠物领养-JavaEE实现宠物领养 - java项目源码
  15. libcef-框架架构中概念介绍-命令行参数-元素布局-应用程序结构(二)
  16. java cmyk转rgb_图片 CMYK转RGB 代码
  17. 亚马逊后台数据分析-电商数据分析
  18. 【BZOJ】【P3110】【Zjoi2013】【K大数查询】【题解】【整体二分】
  19. flvjs is not defined
  20. opencv-pythons实现图像周长面积(三角形)检测DIY整理

热门文章

  1. 错题集一,基础错题集
  2. 计算机打音乐有点甜,有点甜 MIDI File Download :: MidiShow
  3. java计算机毕业设计优课网设计与实现源码+数据库+系统+lw文档+部署
  4. OpenGL与红宝书第八版第一个程序配置
  5. 啥?以后找工作面试求职者的将不是人!那是啥?道翰天琼认知智能机器人平台API接口为您揭秘-1。
  6. 闪蚁市场:全球首个把时间交易与区块链结合的Dapp
  7. 【经典谱和现代谱估计】
  8. docker操作指南
  9. word用宏+excel加解密的VB、python参考代码
  10. Navicat Premium 16安装教程