2016-01-20 14:53:42 industriously 阅读数 8883
  • 《C语言/C++学习指南》单步调试视频教学

    单步调试是程序员的一门技术,它用于地定位代码中的问题。 本教程介绍了错误的分类,定位问题的基本思路、操作作法,并在后介绍了针对大型程序的调试方法:单元测试。 所有初学者都应该尽早地掌握这门技术。 (前2节免费)

    10447 人正在学习 去看看 邵发

阅读源码很枯燥,如果能单步调试岂不是能使逻辑更清晰,本文章讲如何调适android framework。本文使用的环境是ubuntu 14.04,jdk1.6。Android4.4.2源码(有兴趣可以去下载更新版本的代码,其他版本源码编译需要的jdk版本不同,请配置合适的jdk),Android Studio调试其他版本源码framework同理。

如已经编译过源码请跳过1,2步骤。

1.下载android源代码

官网下载https://source.android.com/source/downloading.html(需要翻墙,安装git,repo)。
国内网盘下载http://blog.csdn.net/ilittleone/article/details/6823441

2.编译android源码

官网https://source.android.com/source/building.html
步骤:
a.初始化环境,在源码目录中执行
source build/envsetup.sh或者. build/envsetup.sh
b.选择build类型
lunch aosp_arm-eng
有三种类型:user,userdebug ,eng
这里选择eng
c.开始编译
make -j4
j后边的数字是使用几个线程编译,根据自己cpu配置自行决定,一半为核心数目2倍。
然后就是漫长等待,中间出现各种错误,自行网上搜索解决,大多都是缺少各种配置环境,挨个安装就好。

3.生成android.ipr和android.iml文件

进入Android 源码根目录
执行
mmm development/tools/idegen/
这行命令的意思是编译idegen这个项目,生成idegen.jar文件.生成成功后,会显示这个jar包的位置,并显示 #### make completed successfully
然后执行
sh ./development/tools/idegen/idegen.sh
这行命令的意思是生成对应的文件:android.iws, android.ipr, android.iml .

这里写图片描述

4.android studio导入源码

生成上述对应的文件后,打开Android Studio,选择打开一个现有的Android Studio项目,选择Android源码的根目录,导入即可(起作用的是android.irp文件).在配置sdk版本之后就可以查看Android 源码了.
导入过程比较慢,可以打开android.iml参考网上文章过滤掉一些模块。

这里写图片描述

5.调试代码

Run->Attach debugger to Android process选择要调试的程序

这里写图片描述

选择要调试的程序。

这里写图片描述

这里选择了自己的一个程序,来调试ListView,虚拟机中国年滑动下ListView,编辑器中进入了断点,这样就可以开开心心的,一步一步研究android的一些源码的原理

这里写图片描述

注意:
调试的时候,国产手机有的断点进不去,可能是厂商修改了framework的原因(具体有待考证)所以我这里使用的是虚拟机。

参考:

Android官网http://source.android.com
http://www.jianshu.com/p/c85984cf99e2

2018-09-28 17:27:01 yubo112002 阅读数 301
  • 《C语言/C++学习指南》单步调试视频教学

    单步调试是程序员的一门技术,它用于地定位代码中的问题。 本教程介绍了错误的分类,定位问题的基本思路、操作作法,并在后介绍了针对大型程序的调试方法:单元测试。 所有初学者都应该尽早地掌握这门技术。 (前2节免费)

    10447 人正在学习 去看看 邵发

首先需要一台root过的手机,安装好BusyBox工具箱,并连接到一台配置好adb的调试PC。

 

1、从NDK的prebuild目录下找到对应手机平台的gdbserver,上传到手机,运行游戏,然后运行

gdbserver --attach 127.0.0.1:6666 PID

其中,PID是要调试的应用的进程ID,可以用top或ps命令查看。6666是要使用的端口号,手机上任意一个没有被使用的端口都可以。该命令运行之后,被附加的应用会暂停,等待gdb客户端的连接。

 

2、打开Windows命令行工具,forward一下端口, adb forward tcp:6666 tcp:6666

 

3、windows命令行中运行对应手机平台的gdb工具,通常放在NDK的工具链目录里面,例如:

toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\bin\arm-linux-androideabi-gdb.exe

 

4、在gdb中指定远程目标,运行 target remote:6666

这时候就应该能附加到目标进程上了,然后就像用gdb调试本地程序一样调试就行了。

 

附加说明:

有时候会有SIGPWR或者SIGXCPU这样的信号会让gdb断下来,可以用如下的命令忽略掉这些信号:

handle SIGPWR noprint

handle SIGXCPU noprint

 

另外,手机上的sdcard目录是不能给文件添加可执行权限的,需要把gdbserver拷贝到内部存储目录。但是内部存储根目录默认是只读挂载的,使用如下的命令用读写方式重新挂在即可:

mount -o rw,remount /

 

有时候,用数据线连接手机比较容易碰到线而让连接断开,可以使用adb的TCP连接方式连接手机来解决这个问题。

2015-11-02 17:37:50 qianligaoshan 阅读数 481
  • 《C语言/C++学习指南》单步调试视频教学

    单步调试是程序员的一门技术,它用于地定位代码中的问题。 本教程介绍了错误的分类,定位问题的基本思路、操作作法,并在后介绍了针对大型程序的调试方法:单元测试。 所有初学者都应该尽早地掌握这门技术。 (前2节免费)

    10447 人正在学习 去看看 邵发

前提

        由于实验需要,不得不使用单步调试。之前我一直都是绕道而行,最近几天我发现这个问题不能绕过去,最后选择了面对。这个过程是残酷的,试过了好多方法,都没有成功。最后真是花了九牛二虎之力才讲此配置成功,使用了android studio,Eclipse。在Linux上尝试过,Windows上也尝试过。希望我配置过程能让大家少走弯路,毕竟是亲身经历了的。废话不多说,切入正题。

环境配置

    Windows上的配置和Linux上的配置过程都差不多。简单说明,下载的IDE工具我使用的是Eclipse,SDK,NDK。在Linux上面android studio配置了好久,使用这个IDE时需要注意的是gradle的配置。特别是从Eclipse上导出的项目导入到android studio里面。可能会由于版本不匹配的原因,这个版本不匹配主要表现在build.gradle配置文件中。如果不匹配那就从新配置下载地址,刷新之后,AS(对android studio的简称)会自动下载。之后配置和Eclipse还有些不一样,主要是格式,Eclipse使用了xml,而AS使用了groovy语言。
主要步骤:
  • 设置NDK_PATH路径,在Windows下面是在环境变量那里添加,Linux是在home目录下.bashrc或者.bash中添加。
  • 设置SDK_PATH路径,同上。
  • 在IDE开发工具中添加这些路径。


 接下来就是配置IDE环境。如下:

Eclipse下是在Windows-->Preferences里面。


NDK的配置:


NDK单步调试

      我使用的环境是Windows + Cygwin。我想在Linux下还要更容易一些,个人见解,主要是因为android系统是出自Linux,很多驱动方面的东西都不用担心。现在配置NDK的Debug。
第一步:在Cygwin的.bashrc里面配置相关环境变量,我的是:

Cygwin将Windows下面的磁盘全部都以./cygdrive/磁盘符号,的形式给出的。而不是H:/...这个配置好了之后,将Cygwin下面的bin文件路径添加到Windows的高级环境变量中去,这样我们在Windows下面的命令提示符里面输入Linux的命令,如ls,ndk-build,ndk-gdb等命令。
如:

配置项目的Application.mk

       需要配置的选项:

配置编译项

Project-->Properties

配置NDKROOT

配置Debug

      右击项目,然后选择Debug as


      进入Debug Configurations

双击C/C++ Application会生成一个可执行文件。


项目在编译之后就会在obj中生成app_process、gdb.setup、libc.so、libxxx.so以及linker,根据手机的支持选定armeabi或armeabi-v7a目录下的内容。

将gdb.setup复制一份,假设复制成gdb2.setup,并删除file obj/local/armeabi/app_process
target remote :5039
这行数据。


然后在设置Debug Configuration,选择C/C++ Application下面的应用,选择Main选项卡,进行设置。


然后切换到Debugger选项卡里面设置:


设置Select other


这些设置好之后,对项目重新编译。Debug as运行项目。当项目启动之后,就在Cygwin中进入到项目的目录,使用ndk-gdb --verbose对运行的程序attach,最后就可以调试了。运行效果如下:


总结:

      这是使用了两天配置的环境,希望对大家有一定的帮助,这也是我写下来的原因。时间不早了,该去吃饭了。
2015-08-17 16:56:00 weixin_30485799 阅读数 1
  • 《C语言/C++学习指南》单步调试视频教学

    单步调试是程序员的一门技术,它用于地定位代码中的问题。 本教程介绍了错误的分类,定位问题的基本思路、操作作法,并在后介绍了针对大型程序的调试方法:单元测试。 所有初学者都应该尽早地掌握这门技术。 (前2节免费)

    10447 人正在学习 去看看 邵发

转载:http://www.360doc.com/content/12/1228/11/9462341_256747689.shtml

 

下面就以GDB调试Rild为例,来说明如何调试Native进程。

说明

#cmd     表明该命令运行于android设备控制台上
$cmd     表明该命令运行于Linux PC控制台上
(gdb)cmd 表明该命令运行于GDB控制台上

1. 调试已运行的rild

#ps | grep rild

得到rild的进程rild-pid

#gdbserver :5039 --attach rild-pid

或者调试新的rild进程

#gdbserver :5039 rild

2. 用ADB设置转发端口

$adb forward tcp:5039 tcp:5039

3. 在android的platform目录下

$prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-gdb
out/target/product/saarbmg1/symbols/system/bin/rild

4. 设置符号表

(gdb)set solib-absolute-prefix /home/loginname/android-platform/out/target/product/saarbmg1/symbols
(gdb)set solib-search-path /home/loginname/android-platform/out/target/product/saarbmg1/symbols/system/lib

5. 与GDB server连接

(gdb)target remote :5039
(gdb)shared

后面就可以进行调试了

下面是常用的gdb调试命令

(gdb)help [cmd]                            显示命令cmd的帮助
(gdb)bt                                    显示调用堆栈
(gdb)next|n                                执行下一代码
(gdb)step|s                                执行到下一行代码
(gdb)run|r                                 继续运行
(gdb)jump lineno                           执行到指定行为止
(gdb)break|b lineno|function if condifion  设置断点
(gdb)directory|dir dir1:dir2               指定源文件搜索路径

那么如何调试浏览器webkit等android应用的native代码呢?答案是肯定的,笔者成功单步调试了webkit的代码。

转载于:https://www.cnblogs.com/pengdonglin137/articles/4737058.html

2015-04-19 23:27:26 hjyresdggsd 阅读数 227
  • 《C语言/C++学习指南》单步调试视频教学

    单步调试是程序员的一门技术,它用于地定位代码中的问题。 本教程介绍了错误的分类,定位问题的基本思路、操作作法,并在后介绍了针对大型程序的调试方法:单元测试。 所有初学者都应该尽早地掌握这门技术。 (前2节免费)

    10447 人正在学习 去看看 邵发

一、JAVA层单步调试

参见“用eclipse单步调试Laucher

参见“用eclipse编译调试adnroid的Browser

二、Native层单步调试

参见“使用GDB 单步调试Android本地代码

三、JAVA层堆栈打印

1. 在指定的函数内打印相关java调用

Log.d(TAG,Log.getStackTraceString(new Throwable()));

2. 普通JAVA进程堆栈

ActivityManagerService.dumpStackTraces

保存在系统设置dalvik.vm.stack-trace-file指定的文件data/anr/traces.txt中。可以包含多个进程堆栈信息。

3. 内核进程堆栈

dumpKernelStackTraces,该函数为私有函数,不可调用。

代码在frameworks/base/services/java/com/android/server/Watchdog.java

保存在系统设置dalvik.vm.stack-trace-file指定的文件data/anr/traces.txt中。

4. 出异常时打印当前堆栈

Exception::printStackTrace()

try {
 ...
} catch (RemoteException e) {
  e.printStackTrace();
  ...
}

5. 输出指定进程的堆栈

Process.sendSignal(pid, Process.SIGNAL_QUIT)

保存在data/anr/traces.txt。

这个只对java进程有效,由dalvikvm的SignalCatcher.c处理。

四、Native层堆栈打印

1. CallStack

使用方式:

#include <utils/CallStack.h>
...
CallStack stack;
stack.update();
stack.dump("");  // the parameter is prefix of dump

在使用之前需要修改system/core/include/arch/linux-arm/AndroidConfig.h

#define HAVE_DLADDR 1
#define HAVE_CXXABI 1

并在文件frameworks/base/libs/utils/Android.mk中大约105行(LOCAL_SHARED_LIBRARIES)后添加

ifeq ($(TARGET_OS),linux)
  LOCAL_SHARED_LIBRARIES += libdl
endif

重新编译,push生成的libutils.so到/system/lib/目录下,重启设备。

五、JAVA异常分析

这个android会输出信息到logcat。容易分析。

六、Natvie异常分析

native进程异常会导致

debuggerd会输出信息到logcat并保存到/data/tombstones。

可以修改system/core/debuggerd/debuggerd.c中dump_stack_and_code的代码满足更深的调试信息需求。

六、Natvie异常分析(dalvik方式)

用此方法调试由于GC导致的native异常。

修改vm/interp/Stack.c约456行的dvmCallMethodV函数,添加以下几行。

 LOGD(" YINGMINGBO class:%s\n", clazz->descriptor);
 LOGD(" YINGMINGBO name:%s\n", method->name);
 LOGD(" YINGMINGBO desc:%s\n", desc);

七、日志Log系统

在java中使用

import android.util.Log;
...
Log.d(TAG,"log info");

在Native代码中使用

#define LOG_TAG "YOUR_LOGTAG"
...
#include <utils/Log.h>
#define LOG_NDEBUG 0
...
LOGD("log info");

或者

Log.d(LOG_TAG,“log info”);

使用adb logcat时可以只显示特定类别的LOG,还可以通过参数 -v threadtime 显示线程号及时间信息。

普通标准输出转为Logcat

#system/bin/logwrapper 进程名

八、其他调试手段(命令行)

1. 打印指定JAVA进程的堆栈到文件中

#kill -3 pid

这里的3就是3.5节的Process.SIGNAL_QUIT。

输出在data/anr/traces.txt文件中。

这个只对java进程有效,由dalvikvm处理。

2. 打印指定进程的堆栈到Logcat

#kill -11 pid
或者
#kill -7 pid

这个有时有效。其原理是利用了(六)节的机制。

可以用adb logcat看堆栈调用输出。

3. 打印指定进程的系统调用

#strace -f -p pid -o output

主要输出文件、SOCKET、锁等系统操作的信息。

-f表示跟踪所有子进程.

-o输出log到指定文件,可不用。

没有更多推荐了,返回首页