首页 > 编程语言 >android中c/c++程序的调试(eclipse)

android中c/c++程序的调试(eclipse)

时间:2023-06-08 20:35:52浏览次数:48  
标签:target eclipse system c++ gdb xxxxxx android ANDROID 调试

 

1.           使用 gdbserver 调试
使用 JDWP 只能调试 java 层面的程序,如果想调试 C 层面的代码,需要使用 gdbserver 方式, gdbserver 的服务端和客户端都包含在 android 的源码中。
server 端是 out/target/product/xxxxxx/system/bin/gdbserver 。
client 端是 prebuild/linux-x86/toolchain/xxxxxx/bin/arm-eabi-gdb ),不需另外安装。
(请看完本文再开始调试,尤其是“注意”部分)
本文依据张博的调试文档 , 

2.           调试前的准备:编译 DEBUG

1)          新建(或修改) ANDROID 源码根目录的 buildspec.mk ,加入以下内容
DEBUG_MODULE_lidvm:=true   虚拟机模块设为 debug
TARGET_CUSTOM_DEBUG_CFLAGS:=-O0 -mlong-calls
(请修改具体模块名,我调试的是虚拟机的 libdvm.so

2)         重编 dalvik 模块
$ make clean-libdvm
$ make dalvik snod

3)          重烧 system.img

3.           gdb server

1)          端口映射
$ adb forward tcp:5039 tcp:5039             把设备的 5039 端口映射到 PC 的 5039
设定之后用 netstat -na 命令可看到 PC 的 5039 端口已处于 listen 状态

2)          调试进程号为 2014 进程
$ adb shell
# ps 
找进程号
# gdbserver :5039 --attach 2014     指明 tcp 端口号和进程号
注意:用此方法只适用于对已运行的程序 debug (不能使用直接在 gdbserver 后跟程序名的方式运行)
此时 2014

4.           gdb client

1)          用命令行工具调试
$ $ANDROID_DIR/prebuilt/linux-x86/toolchain/xxxxxx/bin/arm-eabi-gdb $ANDROID_DIR/out/target/product/xxxxxx/system/bin/app_process 注意可执行程序名必须是 app_process ,不是你所调试的程序名
(gdb) set solib-absolute-prefix $ANDROID_SRC)/out/target/product/xxxxxx/symbols/system/lib/
(gdb) set solib-search-path $ANDROID_SRC)/out/target/product/xxxxxx/symbols/system/lib/
以上路径为 GDB 默认库的搜索路径,即交叉编译器库路径,若不设定,则找不到符号表, ( 带符号表的库在 symbols/system/lib/* ,手机里 strip 后无符号表的库在 system/lib/* ,它们必须配套使用 )
(gdb) target remote :5039      指明 TCP 端口号
此时连接 gdb server ,可设断点调试,按 c

2)          用 eclipse

a)           安装 cdt ,使 eclipse 支持 c/c++

                                        i.               下载
http://www.eclipse.org/cdt/downloads.php 下载 cdt-master-4.0.0.zip

                                       ii.               解压
$ mkdir cdt; cd cdt; unzip ../cdt-master-4.0.0.zip

                                     iii.               将解压缩后的 features 、 plugins 两个文件夹的内容复制到 Eclipse 安装目录中
$ cp plugins/* ../../eclipse/plugins/
$ cp features/* ../../eclipse/features/

                                     iv.               重新开启 Eclipse 即可
$ eclipse -clean 在新建 project 中即可看到 c/c++

b)         

                                        i.               新建 C++ project ( 菜单 File->New->Project…)
不使用 default location ,把 Location

                                       ii.               取消自动编译选项 ( 菜单 Project->Build Automatically)

c)           配置 gdb 环境
配置 Debug Configurations( 菜单 Run->Debug Configurations…)

                                        i.               新建一个 C/C++ Local Application 的 debug configuration

                                       ii.               Main 选项卡中
指定 Project 为新建的 C++ 工程,
C/C++ Applications 为 :
$ANDROID_DIR/out/target/product/xxxxxx/system/bin/app_process

                                     iii.               Debugger 选项卡中
指定 Debugger 为 gdbserver Debugger ,
Main 子选项卡的 Gdb debuger 设为:
$ANDROID_DIR/prebuilt/linux-x86/toolchain/xxxxxx/bin/arm-eabi-gdb 设为一个文件名,文件内容如下:
file $ANDROID_DIR/out/target/product/xxxxxx/system/bin/app_process
set solib-absolute-prefix $ANDROID_SRC)/out/target/product/xxxxxx/symbols/system/lib/
set solib-search-path $ANDROID_SRC)/out/target/product/xxxxxx/symbols/system/lib/
Connection 子选项卡:
Type 设为 TCP , Port number 设为 5039

                                     iv.               点击 Debug

d)         

                                        i.               找开某一C程序(菜单 ->Open file

                                       ii.               在程序中双击可设置断点,设置后断点出现在右上的 Breakpoints

                                     iii.               Debug 选项卡提供了工具调试 (suspend, resume 等 )

5.           加打印语句
如果需要在 C

1)          直接在代码中使用 printf ,此方法只能应用于从命令行启动程序的情况,运行时可以 adb shell

2)          使用程序中提供的重定项后的打印语句,并在 logcat 中看到它
例如在 libdvm.so 中使用 dvmFprintf(stderr, “xieyan log\n”);

6.          

1)          在找不到原因时,可以写一个在 android 可以运行的简单 c 语言程序用 gdbserver 调试,以简化问题, android 中 c 程序做法见:
http://www.top-e.org/jiaoshi/html/?157.html

2)          我的是在 arm-eabi-2.4.1 的编译器编出来的,你的可能不是,编译时用 make showcommands  确定你的系统使用的编译工具链,否则如果你 debug

3)          有时编译会引起源码目录的变化,请在左侧 Project explorer

标签:target,eclipse,system,c++,gdb,xxxxxx,android,ANDROID,调试
From: https://blog.51cto.com/u_16125990/6442960

相关文章

  • MyEclipse的使用和程序的断点调试(含常用快捷键)
    MyEclipse的使用     工作空间目录是纯英文不带空格的路径     在eclipse下Java程序的编写和运行,及java运行环境的配置。     新建java工程day01,在弹出窗口中可配置jre     工程右键属性可配置编辑器的版本    调试程序     Debug窗口       ......
  • Android -传统蓝牙通信聊天
    概述Android传统蓝牙的使用,包括开关蓝牙、搜索设备、蓝牙连接、通信等。详细Android蓝牙开发(一)蓝牙通信 简书一、准备工作开发环境:jdk1.8EclipseLunaServiceRelease1(4.4.1)运行环境:华为荣耀6(Android4.4)、华为p9(Android7.0)实现功能:Android蓝牙开发(开关蓝......
  • C++模板
    模板分为函数模板和类模板函数模板模板的语法建立一个通用函数,其函数返回值类型和形参类型可以不具体制定1template<typenameT>2voidmySwap(T&a,T&b){3Ttemp=a;4a=b;5b=temp;6}7intmain(){8inta=10;9intb......
  • [第五届蓝桥杯省赛C++B组]省赛全题目题解
    文章目录快速分支通道酒精与饮料切面条李白打酒史丰收运算打印图形奇怪的分式六角填数蚂蚁感冒地宫取宝小朋友排队1.题目啤酒和饮料算法标签:枚举题目描述:题目答案:题目思路:题目代码:2.题目切面条来源:第五届蓝桥杯省赛C++B组算法标签递推题目描述:题目答案:题目思路:题目代码:3.题目......
  • [第七届蓝桥杯省赛C++B组]省赛全题目题解
    文章目录快速分支通道煤球数目生日蜡烛凑算式快速排序抽签方格填数剪邮票四平方和交换瓶子最大比例煤球数目题目来源:第七届蓝桥杯省赛C++B组算法标签:递推题目描述:题目答案:题目思路:题目代码生日蜡烛题目来源:第七届蓝桥杯省赛C++B组算法标签:枚举,双指针题目描述:题目答案:题目思路:题目代......
  • 在c++ 中 , | 按位或运算符的实际运用场景, 按位或&
              ......
  • 一个RSA的C++封装
    使用RSA的难点:公钥和私钥的保存与加载。在很多的场合下,密钥是以文件的形式分开保存的,对程序员使用者来说,需要解决公钥和私钥的生成、保存、加载问题。加解密过程中的分组问题。RSA加解密的开销很大,比DES和AES高2个数量级,一般情况下不适合用来对较长的数据进行加解密。但是,RSA......
  • Android问题解决:android.util.Base64.encode 导致签名不匹配 SignatureDoesNotMatch
    文章目录前文:遇到问题一问:为什么SignatureDoesNotMatch二问:为什么SignatureDoesNotMatch三问:Signature请求参数为什么多了%0A四问:Signature为什么多了换行五问:android.util.Base64.encode的用法前文:遇到问题在折腾《ESP32-C3入门教程——导读》时,需要对接阿里云物联网平台。想要......
  • C++ 时钟;多角星;花环实现。
     最近在回顾C++,写了几个小玩意儿练习一下,该找工作了,十分焦虑。好了,开始正文首先如何画多角星?比如五角星,六角星等等?这里以五角星为例,r1需要被指定,r2可以通过正弦定理得到。然后通过每一步增加360/2n的角度,依次通过短半径和长半径循环计算每个顶点的坐标。如果需要绘制的图形......
  • 使用 ADB 命令为 Windows Subsystem Android(WSA)配置代理
    注意!以下命令需在命令提示符中执行,不要使用PowerShell,会有字符错误!设置代理:adbconnect127.0.0.1:58526&&adbshell"settingsputglobalhttp_proxy`iproutelistmatch0tableallscopeglobal|cut-F3`:7890"中间一大段会自动识别宿主机ip注意修改7890端口......