android 调试 native 程序的方法
一、背景
首先说需求,这个需求非常常见,就是android上需要的一个功能,linux已经有开源代码而且非常稳定,希望能直接porting过去使用,这个程序是pure c 的代码,也就是说,跟android framework, java 没关系,也跟jni没有关系,我们希望的就是能编译成一个可执行工具,push到android后能直接跑起来使用。
既然是native 代码,主要影响到的就是bionic libc, 因为android的这个基础库跟 linux 上常见的 gnu libc 有区别,主要是被精简了,至于更具体理解什么叫被精简,建议找个linux 开源工具代码在 android ndk 环境里编一下就知道了,其实,这里边还隐藏另外两层区别,一个是 android api level, 就是所谓的android 版本,比如 android 4.4.4 对应 android API 19, android 5 对应 android API 21 , 不同版本的 bionic libc 本身也是有区别的。 另一个是 abi , 就是体系架构的区别,比如 x86, x86_64, armeabi -v7a 等等,不同 abi 设置下 bionic libc 用到的接口也不一样。上面这两个影响会导致,你的代码可能在 API 21 编译通过了,但是在 API 19 失败,或者,在 armeabi-v7a 成功了,但是在 arm64-v8a 失败了。这两点的处理放在另外的文章说明,这篇文章不考虑。可以认为,我们暂时不考虑编译出来的工具的通用性,只在特定的目标,如 abi = armeabi-v7a, api = 21 的android devices 上运行。
好了,我们已经编成功了这个工具,push 到目标设备后(或模拟器)发现运行出现段错误,这是非常常见的,因为在移植过程中,我们把某些 glibc 的调用替换成了 bionic 的调用,接下去应该怎么调试呢?首先说这里的调试,当然是源码级别的单步调试,就是我们在 linux 上开发并调试程序一样。这个要求看似简单,但我搜索了一天的时间,尝试了多种方式,最后才找到一种简单可用且匹配需求的方式。
二、方法
首先,尝试搜索 gdb-for-arm 的工具,就是看有没有一个 gdb 可执行程序,是可以直接在 android arm devices 上运行的,如果有的话,就跟直接在 linux 环境里调试一样了,可惜,这么简单的需求,都搜索不到
下面都是尝试用远程调试的方式
第一种,客户端在win7. 使用 ida pro 6.6 , 它提供了一个 android_server 可以用来push到 android 系统里运行,然后在 ida 的界面里 run remote 可执行程序,这种方式可以跑起来,可以单步执行、可以下断点,但是无法加载正确的符号表。
第二种,客户端在win7,找了一个 http://gnutoolchains.com/android/ 为android 编译好的 gnu tool chains 网站,下载 gdbserver 和 gdb.exe , gdbserver push到目标机器跑起来,本地用 gdb.exe 启动,使用gdb 远程调试那套步骤进行设置,发现也是能够跑起来,还是无法正确加载符号表。
第三种,客户在在win7,使用 Cygwin 的方式跑gdb客户端,启动之后 cygwin 报了一个长度太长的问题,没有深入去解决
从这里开始,突然对在win7 下启动 gdb 客户端有些失望,随即改为在 ubuntu14.04 里启动 gdb 客户端, android 模拟器也在 ubuntu 里启动。这里的 ubuntu 跑在 win7 上的 vmware 里。具体如果在 ubutnu 里下载并配置 android sdk 开发环境,并创建 avd , 启动 avd, 可以从网上搜索,最终就是在 ubuntu 里正常启动一个 android emulator.
然后,就使用下面的方式,就是可以源代码单步调试了:
4. 在设备上通过gdbserver运行你的程序
android 调试 native 程序的方法的更多相关文章
- ubuntu下整合eclipse和javah生成jni头文件开发android的native程序
0:前言: 这两天一直在研究用android的jni调用第三方库,上网搜方法,但是都是泛泛而谈,没有demo,经过我几番折磨,写了n多的helloword工程,总是不成功,工程名字也就由helloow ...
- 调试 Android* x86 应用程序的方法以及要使用的工具
作者:Xiaodong Wang 1.简单介绍 众所周知,Android* 开发者头顶很多称呼:设计员.程序员等,而且一般会不可避免地被称为故障检修工. 代码中的错误无法避免.因此不管您是否一開始就造 ...
- [Android设计模式]Android退出应用程序终极方法
如何干净彻底地退出Android应用程序,是很多开发者的心头痒.如何干净地关闭所有已打开的Activity? 如何关闭指定的Activity? 如何关闭一类Activity? 这里,我们提出一种通过实 ...
- php异步调试和线上调试网站程序的方法
当碰到一个网站需要不间断运行,但又需要调试该网站的程序错误的时候,该如何办呢?是靠经验一点点猜测,还是直接打印错误信息让其在页面输出? 下面分享一种方法同时满足这两种条件,既方便网站程序错误调试,又不 ...
- ubuntu下整合eclipse和javah生成jni头文件开发android的native程序(转)
本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的javah命令,第二种为整合javah到eclipse里面.推荐第二种方式,方便快捷,随时修改随时生成 0:前提和条件: 1:u ...
- Android下用程序的方法为ListView设置分割线Divider样式
使用XML的时候可以使用android:divider属性为ListView设置分割线的样式(颜色或者资源文件),而在Java代码中默认提供的方法 listView.setDivider() 却只支持 ...
- [转]ubuntu下整合eclipse和javah生成jni头文件开发android的native程序
转载自:http://blog.csdn.net/jiuyueguang/article/details/9404237 本文介绍两种利用javah命令生成jni头文件的方法,第一种为大众所知的jav ...
- 调试CEF3程序的方法
CEF3多进程模式调试时按F5只会启动调试Browser进程,要调试Renderer进程就要让进程在启动时就暂停并附加进程. 所幸google早就想到了这一点,chrome的命令行参数就可以办到, - ...
- Android 调试native的crash和anr
1. 于trace找到相应的库.例如 liba.so和相应的地址信息 2. 采用addr2line 查看 addr2line 住址 -e liba.so -f 要么 arm-eabi-addr2lin ...
随机推荐
- deeplearning.ai课程学习(4)
第四周:深层神经网络(Deep Neural Networks) 1.深层神经网络(Deep L-layer neural network) 在打算使用深层神经网络之前,先去尝试逻辑回归,尝试一层然后 ...
- CentOS7安装Jenkins Master
一.安装java环境 1.查看服务器版本 cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) 升级操作系统 yum update ...
- JavaSE复习(二)集合
Collection List(存取有序,有索引,可以重复) ArrayList 底层是数组实现的,线程不安全,查找和修改快,增和删比较慢 LinkedList 底层是链表实现的,线程不安全,增和删比 ...
- [译]如何比较同一分支上的不同commit的代码区别?
原文来源:https://stackoverflow.com/questions/3338126/how-do-i-diff-the-same-file-between-two-different-c ...
- Elasticsearch 监控和部署
Elasticsearch: ! [ https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/_cluster_health. ...
- Reactor模式是什么(转载)
一.Reactor模式是什么反应器设计模式(Reactor pattern)是一种为处理并发服务请求,并将请求提交到一个或者多个服务处理程序的事件设计模式.当客户端请求抵达后,服务处理程序使用多路分配 ...
- linux tomcat 启动报错 Cannot find /etc/bin/setclasspath.sh
这是由于tomcat/bin/catalina.sh文件中有一个设置变量的方法 $CATALINA_HOME 有的tomcat中需要默认此值 $CATALINA_HOME=tomcat地址
- ASP.NET页面之间传值Session(2)
想必这个肯定是大家使用中最常见的用法了,其操作与Application类似,作用于用户个人,所以,过量的存储会导致服务器内存资源的耗尽. 优点:1.使用简单,不仅能传递简单数据类型,还能传递对象. 2 ...
- [BZOJ5417] [NOI2018]你的名字
Description 小A 被选为了ION2018 的出题人,他精心准备了一道质量十分高的题目,且已经把除了题目命名以外的工作都做好了. 由于ION 已经举办了很多届,所以在题目命名上也是有规定的, ...
- [Leetcode] scramble string 乱串
Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty substrin ...