Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 573|回复: 0

Q&A: android调试c/c++

[复制链接]

该用户从未签到

发表于 2011-10-22 17:28:33 | 显示全部楼层 |阅读模式
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-&gtroject…)
不使用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
GDB command file设为一个文件名,文件内容如下:
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中刷新相关项目
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-6-10 02:51 , Processed in 0.405724 second(s), 48 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表