对于在Windows上写代码写习惯的人,调试是必不可少的手段,并且转入Android之后,发觉调试手段异常狭小,跟Windows简直不是一个级别,非常是Android的内核调试,网上资料也相对较少,不过通过一段时间的鼓捣,我总算找到了还算靠谱的调试方式.就是借助Emulator+Eclipse进行AndroidLinux内核调试.

1.系统预装环境

在目前为止,都是使用的最新版本的Android开发环境

Ubuntu14.04

AndroidSDK(adt-bundle-linux-x86_64-20140702)

AndroidNDK(android-ndk32-r10b-linux-x86_64)

安装好这几个环境之后,设置一下环境变量

exportPATH=$PATH:ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin

ANDROID_NDK_HOME通配符为AndroidNDK安装目录,设置这个环境变量的目的主要是为了使用gcc4.6版本编译linux内核.

exportPATH=$PATH:ANDROID_SDK_HOME/sdk/tools

ANDROID_SDK_HOME是AndroidSDK的安装目录,设置这个环境变量的目的是便捷使用emulator!

万事具备.使用上面安装的AndroidSDK创建一个虚拟的设备.但是确保emulator-avdDevice_Test这条可以启动Android模拟器.先热身下.

wsl安装Ubuntu_ubuntu 安装kernel_虚拟机安装Ubuntu

2.AndroidLinux内核编译

2.1下载GoldFish源码

mkdirkernel

cdkernel

gitclone

GoldFish是适配模拟器的内核源码,假如是要具体适配其他型号,请选择其他源码,那边不展开了,详情参考链接有说明.假如失败了,换https.我换https是由于使用了代理,如今google被墙,不使用代理搞不动!

gitclone

下载过程看你的代理速率了,但是不能中断.中断了就要重新来,非常的麻烦和难受!所以我上传了一份到百度云.和前面goldfish下来的一样.可以考虑去下载

下载或则解压完成之后会在kernel目录下会生成一个goldfish文件夹,步入此目录.查看所有分支

可以看见,有好多的版本,2.6.29和3.4我都测试过.编译和运行没有任何问题.所以那边我们拉2.6.29的源码

gitcheckoutremotes/origin/android-goldfish-2.6.29

wsl安装Ubuntu_ubuntu 安装kernel_虚拟机安装Ubuntu

之后目录下就有好多文件了,说明AndroidLinux的源码下载成功!

wsl安装Ubuntu_虚拟机安装Ubuntu_ubuntu 安装kernel

3.2编译GoldFish源码

编译源码之前,请确认早已将NDK的编译工具设置到环境变量中.我们将使用上述这个目录下的交叉编译器arm-linux-androideabi-gcc

exportPATH=$PATH:ANDROID_NDK_HOME/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin

之后在glodfish目录下用gedit打开Makefile文件,找到这两行文字:

#ARCH?=$(SUBARCH)

#CROSS_COMPILE?=

更改成

ARCH?=arm

CROSS_COMPILE?=arm-linux-androideabi-

wsl安装Ubuntu_ubuntu 安装kernel_虚拟机安装Ubuntu

保存文件,之后

makegoldfish_armv7_defconfig

ubuntu 安装kernel_虚拟机安装Ubuntu_wsl安装Ubuntu

注:用$makegoldfish_defconfig这样配置也可以编译通过,模拟器也可以启动,并且Android的开机画机就显示不了,$adb也死活连不上,缘由就是这个goldfish_defconfig这个配置文件问题.

AndroidLinux的基本编译就设置完成了.我们先make一下

make

ubuntu 安装kernel_wsl安装Ubuntu_虚拟机安装Ubuntu

这就表示编译成功了,Linux的源码是Linux上少有的一键make过去的软件,比编译其他Linux应用简单不少.其实到这儿编译下来的这个zImage早已可以运行了,而且离我们拿来做调试的还是有差别.我们还要开启内核调试和关掉优化.

3.3开启调试选项

开启Linux内核的调试选项,先安装依赖性

sudoapt-getinstallncurses-dev

之后

makemenuconfig

ubuntu 安装kernel_wsl安装Ubuntu_虚拟机安装Ubuntu

步入内核配置界面,勾选下述选项,同时关掉优化

Generalsetup—>

[]Optimizeforsizeubuntu 安装kernelubuntu 安装kernellinux标准教程,进行开启/关掉

[*]Kernelhacking

[*]Compilethekernelwithdebuginfo

[*]KGDB:kerneldebuggingwithremotegdb—>

[*]Enabledynamicprintk()callsupport

关掉Linux内核优化比较麻烦.我通过和同学讨论,以及网路搜索还没有找到挺好的解决办法,缘由是默认的Linux内核编译是开启-O2优化的,这些模式之下会导致gdb和实际的源码对不上,相信使用过windbg调试-O2的同学都有这个经历,所以我们须要关掉Linux的-O2,不过目前还没有挺好的解决办法下边这篇文章讨论的解决办法是.针对文件进行关掉优化.下边这两篇文章的讨论都十分有意义:

那边我们将-Os和-O2都调成-O.针对具体文件关掉优化,那边就不搞了.具体到自己的调试任务的时侯再看.

再进行编译,

make-B

选项-B以强制所有内核源文件全部重新编译(由于我后面编译过一次了,为了保险起见,就让目标文件全部重新生成吧)当出现这个画面,就表示编译成功了

虚拟机安装Ubuntu_ubuntu 安装kernel_wsl安装Ubuntu

4.AndroidLinux内核调试

使用emulator启动我们编译的内核试试

emulator-verbose-show-kernel-kernel~/kernel/goldfish/arch/arm/boot/zImage-avdDevice_Test

wsl安装Ubuntu_虚拟机安装Ubuntu_ubuntu 安装kernel

没错,启动的就是我们的内核2.6.29时间也对的上.说明我们编译的内核是可以运行的.下一步使用这条

emulator-verbose-show-kernel-kernel-netfast~/kernel/goldfish/arch/arm/boot/zImage-avdDevice_Test-qemu-gdbtcp::1234,ipv4,-S

这条命令会在tcp端口的1234窃听.加了-S都会暂停出来,等待着gdb链接上来.这时侯我们开启NDK目录下边的gdb.链起来之后

targetremotelocalhost:1234

还可以测试几条命令,瞧瞧源码是否跟上了.

wsl安装Ubuntu_ubuntu 安装kernel_虚拟机安装Ubuntu

ubuntu 安装kernel_wsl安装Ubuntu_虚拟机安装Ubuntu

到这儿为止,基本上是用gdb连上emulator进行内核调试应当没问题了.并且仅仅到这儿那离windbg的调试还是差好几条街.所以我们还是须要一个更好的调试方式.是用eclipse来作为调试的后端!

5.Eclipse后端

是用Eclipse作为后端的用处是,无论是在windows,在linux下边都没有问题.可以在一台windows的机器上,远程调试android内核.所以为了截图便捷,我下边的操作都是在windows上弄的,在Linux上也是一样!其实要在windows上进行调试,首先要将里面的gold目录复制到windows的机器上,或则是共享给windows.这儿就不展开了!

运行Eclipse,点击菜单Help->InstallNewSoftware…在弹出的对话框里点击Workwith:旁边的下拉按键,选择Kepler–

不同的Eclipse版本选择不一样,与自己下载的版本一致一即可.之后在下边的选择框少将以下选项安装上

ProgrammingLanguages

C/C++Autotoolssupport

C/C++VisualC++Support

C/C++DevelopmentTools

C/C++DevelopmentToolsSDK

LinuxTools

GDBTracepointAnalysis

MobileandDeviceDevelopment

C/C++GDBHardwareDebugging

安装好后手动重启Eclipse即可.再配置点击菜单Window->Preferences在弹出的对话框中,点击左侧的General->Workspace将右侧的Buildautomatically复选框不选中.

再点击对话框右侧的C/C++->Indexer,将右侧的Enableindexer和Automaticallyupdatetheindex两复选框不选中.

接出来就简单了.创建一个工程,点击菜单File->New->Project…在弹出的对话框中选择C/C++->CProject再点击Next>按键

虚拟机安装Ubuntu_wsl安装Ubuntu_ubuntu 安装kernel

wsl安装Ubuntu_虚拟机安装Ubuntu_ubuntu 安装kernel

虚拟机安装Ubuntu_ubuntu 安装kernel_wsl安装Ubuntu

其中Projectname:为工程名,可自定义.而Location:则为工程文件所在路径,此处设置为我们下载的源码路径而Projecttype:则设置为Makefileproject/EmptyProject,Toolchains:则设置为LinuxGCC,倘若是windows设置成AndroidGCC最后点击Finish即可.

接出来Windows和Linux都一样,进行DEBUG配置,在ProjectExplorer里右击刚创建的Linux_Kernel项目,在右键菜单中点击DebugAs->DebugConfigurations…在弹出的对话框中双击GDBHardwareDebugging之后配置调试选项如右图

wsl安装Ubuntu_虚拟机安装Ubuntu_ubuntu 安装kernel

将C/C++Application:栏设置为LinuxKernel源码编译下来的vmlinux文件所在路径(包含文件名),之后将Disableautobuild选上,切换到Debugger页,更改配置如下截图.

虚拟机安装Ubuntu_wsl安装Ubuntu_ubuntu 安装kernel

这儿是设置gdb的路径还有远程地址和端口.Gdb的路径在ndk安装目录下的如下路径

toolchainsarm-linux-androideabi-4.6prebuiltwindows-x86_64bin

远程地址,我的ubuntu机器是192.168.1.2这个随机应变即可.端口是我们运行emulator命令定义的端口.搞定这个切换到Startup页面

虚拟机安装Ubuntu_ubuntu 安装kernel_wsl安装Ubuntu

将ResetandDelay(seconds)和Halt还有Loadimage复选框的勾都除去.之后点击Debug,这时侯就停在第一条指令了

这时侯还不能按F5,F6单步.我们在Execut窗口指定到main.c之后在start_kernel上下个断点也可以再Console窗口敲命令breakstart_kernel.之后敲入命令C.

虚拟机安装Ubuntu_wsl安装Ubuntu_ubuntu 安装kernel

这时侯就停在了Linux内核的入口函数start_kernel.也可以使用F5,F6了.寄存器显示各方面都可以了.假如在Windows上,有一个毛病,源文件都要自己重新指定路径.不然认不到.默认都是编译路径/home/xxx哪些的.要重新指定成Windows的c盘方式.不过在Linux上调试就没有这个问题了!

这个调试差不多是搞起走了.假如是剖析Android的源码,看一看跟一下还是很不错的.不过还是有一个问题没有解决,关于汇编和符号不对应的问题

看雪众测:

看雪峰会:

-----陌陌ID:ikanxue-----

看雪•安全持续关注安全16年linux qq,专业为您服务!

本文原创地址://lrxjmw.cn/rhlyejxanhts.html编辑:刘遄,审核员:暂无