android native 代码,Android编程之使用GDB调试Android Native 层代码

本篇教程探讨了Android编程之使用GDB调试Android Native 层代码,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入。

a85c7e084c77a9da9e420c45cb94fe99.png

<

步骤:

0. adb root

0. adb shell

0. ps | grep browser

1. gdbserver :5039 --attach pid

2. adb forward tcp:5039 tcp:5039

1. prebuilts/gcc/linux-x86/arm/arm-eabi-4.7/bin/arm-eabi-gdb out/target/product/scx35l_sp9630ea/symbols/system/bin/app_process

2. set solib-absolute-prefix out/target/product/scx35l_sp9630ea/symbols

3. set solib-search-path out/target/product/scx35l_sp9630ea/symbols/system/lib

4. target remote :5039

5. shared

android 5.0:

prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-gdb out/target/product/scx35_sp7731gea_hd/symbols/system/bin/app_process32

set solib-absolute-prefix out/target/product/scx35_sp7731gea_hd/symbols

set solib-search-path out/target/product/scx35_sp7731gea_hd/symbols/system/lib

target remote :5039

android6.0以上版本

android sharkl64

source ***

lunch ***

gdbclient app_process :539 com.android.browser

查看汇编:

disassemble /m hanshu

set var width=47 修改变量

gdb: 修改函数返回值:

GNU gdb Fedora (6.8-37.el5)

Copyright (C) 2008 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later 

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law. Type "show copying"

and "show warranty" for details.

This GDB was configured as "i386-redhat-linux-gnu"...

(gdb) b main

Breakpoint 1 at 0x80483e9: file main.c, line 14.

(gdb) r 7

Starting program: /root/program/testgdb/main 7

Breakpoint 1, main (argc=2, argv=0xbf89e694) at main.c:14

14 int input_val = 0;

(gdb) n

15 if(argc 

(gdb)

20 input_val = atoi(argv[1]);

(gdb)

21 if(func1(input_val))

(gdb) s --------------要进入函数内

func1 (input=7) at main.c:6

6 if(input 

(gdb) n

7 return -1;

(gdb) disassemble ---- 反编译一下当前函数

Dump of assembler code for function func1:

0x080483b4 : push %ebp

0x080483b5 : mov %esp,%ebp

0x080483b7 : sub $0x4,%esp

0x080483ba : cmpl $0x9,0x8(%ebp)

0x080483be : jg 0x80483c9 

0x080483c0 : movl $0xffffffff,-0x4(%ebp)

0x080483c7 : jmp 0x80483d0 

0x080483c9 : movl $0x0,-0x4(%ebp)

0x080483d0 : mov -0x4(%ebp),%eax ---- 返回值将保存到eax寄存器中

0x080483d3 : leave

0x080483d4 : ret

End of assembler dump.

(gdb) i r ---- 查看当前寄存器的值,主要是eax,此时还未执行"return -1"

eax 0x7 7

ecx 0x0 0

edx 0x0 0

ebx 0x9f8ff4 10457076

esp 0xbf89e5c4 0xbf89e5c4

ebp 0xbf89e5c8 0xbf89e5c8

esi 0x8b0ca0 9112736

edi 0x0 0

eip 0x80483c0 0x80483c0 

eflags 0x293 [ CF AF SF IF ]

cs 0x73 115

ss 0x7b 123

ds 0x7b 123

es 0x7b 123

fs 0x0 0

gs 0x33 51

(gdb) n

10 }

(gdb) i r ----- 查看当前寄存器的信息,此时已执行"return -1",eax的值也变成了-1,函数退出后修改

eax 0xffffffff -1

ecx 0x0 0

edx 0x0 0

ebx 0x9f8ff4 10457076

esp 0xbf89e5c4 0xbf89e5c4

ebp 0xbf89e5c8 0xbf89e5c8

esi 0x8b0ca0 9112736

edi 0x0 0

eip 0x80483d3 0x80483d3 

eflags 0x293 [ CF AF SF IF ]

cs 0x73 115

ss 0x7b 123

ds 0x7b 123

es 0x7b 123

fs 0x0 0

gs 0x33 51

(gdb) set $eax = 0 ---- 通过set命令修改eax的值,与变量不同,修改寄存器的值时,需要在寄存器名称前加'$'

(gdb) i r ---- 再次查看eax的值,eax已变为0.

eax 0x0 0

ecx 0x0 0

edx 0x0 0

ebx 0x9f8ff4 10457076

esp 0xbf89e5c4 0xbf89e5c4

ebp 0xbf89e5c8 0xbf89e5c8

esi 0x8b0ca0 9112736

edi 0x0 0

eip 0x80483d3 0x80483d3 

eflags 0x293 [ CF AF SF IF ]

cs 0x73 115

ss 0x7b 123

ds 0x7b 123

es 0x7b 123

fs 0x0 0

gs 0x33 51

(gdb) n ---- 继续执行代码,可看到程序输出"Input numeric is bigger than 10."。我们通过修改寄存器的值,对程序代码的执行过程进行了控制。

main (argc=2, argv=0xbf89e694) at main.c:24

24 printf("Input numeric is bigger than 10./n");

(gdb) c

Continuing.

Input numeric is bigger than 10.

Program exited normally.

(gdb)

--------------example:

gdb 调试:

$adb shell

看看它的process id是多少

#ps | grep browser

记住你要的pid

启动gdbserver, 指定在哪个prot上监听client,指定调试哪个进程

#gdbserver :5039 --attach pid

开始cient端的工作

On your workstation, forward port 5039 to the device with adb: 不知道怎么翻译

打开一个新的终端

$adb forward tcp:5039 tcp:5039

$cd ~/mydroid

找一个最新版本的arm-eabi-gdb

$find -name arm-eabi-gdb

记住path

启动gdbclient

$/home/peipei/mydroid/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-gdb /home/peipei/mydroid/out/target/product/generic/symbols/system/bin/app_process

In gdb, Tell gdb where to find the shared libraries that will get loaded:

(gdb)set solib-absolute-prefix /home/peipei/mydroid/out/target/product/generic/symbols

(gdb)set solib-search-path /home/peipei/mydroid/out/target/product/generic/symbols/system/lib

小心,路径别写错,如果错了,gdb是不会告诉你的。

另外,要注意,两个路径都要指向symbols目录。

Connect to the device by issuing the gdb command:

(gdb)target remote :5039

The :5039 tells gdb to connect to the localhost port 5039, which is bridged to the device by adb.

You may need to inspire gdb to load some symbols by typing:

(gdb)shared

本文由职坐标整理发布,学习更多的相关知识,请关注职坐标IT知识库!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值