`
maricoliu
  • 浏览: 55170 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

Android 系统中使用GDB调试C程序

阅读更多

Android 系统中使用GDB调试C程序

 

调试环境说明:

操作系统:Ubuntu 11.10 32bit

Android源码版本:Android 4.0.3 r1

EmulatorAndroid4.0.3

 

注:本文以调试Android源码自带的memtest程序做为例子,调试前已经编译过一次Android源码,编译目标是full-eng,如何编译源码,如何使用编译得到的镜像启动模拟器这里就略过了

 

1.       准备工作:

启动模拟器

#emulator –system ~/system.img –data ~/userdate.img –ramdisk ~/ramdisk.img –kernel ~/kernel-qeum-armv7

 

2.       安装没有被stripmemtest到模拟器

使用gdb调试程序,则被调试程序必须带有调试信息,Android编译源码时默认带有调试信息,,但是最后生成的系统文件中的程序和库还是会被strip,但是out目录里面还是存放了带有调试信息的程序,下面会介绍。

这里假设你已经执行了一次源码编译,那么源码自带的memtest程序也会被编译

Memtest的源码存放路径为:

~/source_code/system/extras/tests/memtest

编译后没有strip的可执行程序路径一般为:

~/source_code/out/target/product/generic/obj/EXECUTABLES/memtest_intermediates/LINKED/

进入到上述目录,将memtest程序push到模拟器/data/bin下(事先在data下建立bin目录)

#adb push memtest  /data/bin

3.       启动gdbserver

我们编译出来的系统都已经自带了gdbserver,如果没有,例如真机,可以在prebuilt里面找到编译好的安装上去

这里我们直接在adb shell中启动gdbserver

#gdbserver  :1234 /data/bin/memtest

正常的话应该显示:

Process /data/bin/memtest created; pid = 571

Listening on port 1234

 

4.       启动arm-eabi-gdb进行调试

然后在另一个终端里面启动gdb客户端

A.首先设置模拟器端口转发:

#adb forward tcp:1234 tcp:1234

 

B. 启动arm-eabi-gdb:

Android源码的prebuilt/linux-86/toolchain/arm-eabi-4.4.3/bin下面有这个程序,当然你也可以选择其他版本的gdbargc为程序参数

# ~/source_code/prebuilt/linux-86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-gdb ~/source_code/out/target/product/generic/obj/EXECUTABLES/memtest_intermediates/LINKED/memtest [args]

正常启动后会显示:

GNU gdb (GDB) 7.1-android-gg2

Copyright (C) 2010 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

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 "--host=x86_64-linux-gnu --target=arm-elf-linux".

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>...

Reading symbols from /work_dir/android4.0.3/out/target/product/generic/obj/EXECUTABLES/memtest_intermediates/LINKED/memtest...done.

(gdb)

C. 执行set solib-xxx 这两个命令,建立符号链接

(gdb) set solib-absolute-prefix ~ /out/target/product/generic/symbols/

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

D.连接gdbserver进行调试:

(gdb) target remote :1234

成功的话显示:

Remote debugging using :1234

Reading symbols from /work_dir/android4.0.3/out/target/product/generic/symbols/system/bin/linker...done.

Loaded symbols for /work_dir/android4.0.3/out/target/product/generic/symbols/system/bin/linker

__dl__start () at bionic/linker/arch/arm/begin.S:35

35        mov    r0, sp

(gdb)

 

另一个控制台会显示:Remote debugging form host 127.0.0.1

 

如果没执行set solib-×××的两个命令会显示如下信息:

warning: Unable to find dynamic linker breakpoint function.

GDB will be unable to debug shared library initializers

and track explicitly loaded dynamic code.

0xb0000100 in ?? ()

 

5.       最后终于可以进行gdb调试了

Gdb调试工具是基于命令行的,调试命令可以参考如下连接:

http://blog.csdn.net/dadalan/article/details/3758025

 

设置断点命令:breakpoint nb nn为程序行号或是函数名称,例如在main函数出打上断点

         (gdb) b main

         Breakpoint 1 at 0xa504: file system/extras/tests/memtest/memtest.cpp, line 107.

 

         从断点开始继续执行:continue c,例如:

(gdb) c

Continuing.

 

Breakpoint 1, main (argc=1, argv=0xbea51c84)

             at system/extras/tests/memtest/memtest.cpp:107

107        if (argc == 1) {

 

单步执行:next n ,例如:

(gdb) n

106    {

(gdb) n

107        if (argc == 1) {

(gdb) n

108            usage(argv[0]);

(gdb) n

109            return 0;

 

打印变量值:print param p paramparam为变量名,例如打印argc的值:

(gdb) p argc

$1 = 1

 

含有很多有用的命令,查看当前运行程序的源码:listl,查看函数堆栈:bt,查看断点信息:info break,设置观察点:watch,退出gdbq,终止程序:kill

程序调试运行完后,启动gdbserver的客户端会打印程序的运行结果,并停止server,如果要重新开始调试,不要忘了先启动gdbserver,再启动gdbclient

 

这里只介绍了Android gdb简单的使用方法,还有很多东西可以研究,例如调试动态库so,当然gdb本身还是有很多研究的地方的,甚至有着图形化工具不能完成的功能。有机会继续研究~

分享到:
评论
2 楼 maricoliu 2012-06-22  
TremendousTurtle 写道
很强大,能不能调试真机?

应该可以的
1 楼 TremendousTurtle 2012-06-21  
很强大,能不能调试真机?

相关推荐

    android下的gdb调试

    对于Android开发,这通常涉及到NDK(Native Development Kit),它允许我们在Android应用中使用C和C++代码。 GDB在Android环境中的使用涉及以下几个步骤: 1. **构建可调试版本**:你需要构建一个包含调试信息的APK...

    gdb动态调试android可执行程序1

    1. Android NDK:Android NDK是一组工具集,允许开发者使用C++和其他native语言来编写Android应用程序中的部分代码。NDK提供了一个编译器、库和调试工具,可以帮助开发者快速开发高性能的Android应用程序。 2. GDB...

    aarch64-linux-android-gdb.zip

    《深入解析aarch64架构下的Android GDB调试技术》 在移动设备和嵌入式系统领域,aarch64架构已经成为主流,特别是在Android平台上,它为开发者提供了强大的64位计算能力。与此同时,为了更好地调试和优化软件,理解...

    Eclipse+CDT+GDB调试android_NDK程序

    【Eclipse+CDT+GDB调试Android NDK程序】是一种在Eclipse集成开发环境中,利用CDT(C/C++ Development Tooling)和GDB(GNU Debugger)进行原生代码调试的技术。Android NDK允许开发者在Android应用中使用C或C++编写...

    GDB之在线调试与Coredump分析

    GDB(GNU Debugger)是一个功能强大的程序调试工具,它用于C/C++等程序的调试。通过GDB可以执行以下操作:启动程序、设置断点、单步执行、改变变量的值、检查程序运行时信息等。在线调试是在程序运行的过程中进行...

    Android源码本地C++代码调试方法

    - 在Main子页中,选择预构建的GDB调试器,例如`prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-gdb`。 - 如果遇到`libpython2.6.so.1.0`找不到的问题,可以尝试将Ubuntu的Python 2.7卸载,或者创建软链接...

    gdb-7.5_android_ubuntu10.04_python26

    **Android调试**: 在Android开发中,GDB通常与NDK(Native Development Kit)一起使用,用于调试C和C++的本地代码。通过ADT(Android Developer Tools)和Eclipse IDE,开发者可以设置断点,查看变量值,单步执行...

    android6.0适用gdb/gdbserver以及linker

    GDB (GNU Debugger) 和GDBserver是Linux和Android系统中常用的远程调试工具,它们允许开发者在本地主机上控制运行在目标设备上的程序。本文将详细介绍如何在Android 6.0上安装和使用GDB及GDBserver,以及如何利用...

    gdb-7.3.1_android_ubuntu10.04_python26

    在Android开发中,GDB通常与NDK(Native Development Kit)一起使用,用于调试C和C++的原生代码。由于Android系统部分核心组件以及许多应用使用了这些语言编写,因此原生代码的调试能力至关重要。GDBserver是GDB的一...

    gdb for android

    GDB (GNU Debugger) 是一个强大的源代码级调试工具,广泛应用于C和C++程序的调试。在Android平台上,GDB的Android版本使得开发者能够对运行在Android设备上的本地(Native)代码进行调试,这对于优化性能、定位底层...

    android+arm-linux-androideabi+gdb+android-api>=21+android 10

    使用这个版本的GDB,开发者可以直接在Android 10设备上调试本地C/C++代码,这对于优化性能、解决内存泄漏问题或者调试原生库(如NDK开发)来说极其方便。 5. **使用步骤**: - 首先,将`arm32-gdb`解压到你的开发...

    [Android系统级深入开发—移植与调试].扫描版.pdf

    此外,书中还涉及了JNI(Java Native Interface)的使用,以及如何结合GDB进行C/C++代码的调试,这对于系统级开发人员尤其重要。 除了理论知识,书中还包含了大量的实践案例,覆盖了从简单的应用调试到复杂的系统级...

    Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

    这篇“Android学习笔记——利用JNI技术在Android中调用、调试C++代码”将带你深入理解如何在Android应用中使用JNI来调用C++代码,以及如何进行调试。以下是对这一主题的详细阐述。 1. **JNI简介** JNI是Java平台的...

    gdb+gdbserver

    然而,当涉及到跨平台调试,特别是在Android设备上,直接在Windows上使用gdb可能会遇到兼容性问题,因为Android系统通常基于ARM架构,而Windows通常是x86或x64架构。这就是`gdbserver`的角色所在。`gdbserver`是gdb...

    Android NDK翻译之 NDK-GDB.html

    Android NDK-GDB是针对使用C/C++编程语言在Android平台上开发应用的开发者所必备的调试工具。从NDK r4版本开始,NDK引入了NDK-GDB,使得开发者能够方便地对本地代码进行调试。本文将详细介绍NDK-GDB的使用方法及其...

    virtual gdb vs2022可用

    总结来说,这个主题涉及的是如何在Visual Studio 2022中使用VisualGDB这一插件,通过虚拟GDB功能来实现远程或嵌入式系统的调试。提供的两个文件可能就是实现这一功能所需的安装和配置工具。通过安装和设置VisualGDB...

    Android系统级深入开发—移植与调试.韩超.梁泉.扫描版

    Android系统调试是指在开发过程中查找和修复问题的过程。调试可以应用于应用程序层面或系统级别,具体取决于问题的复杂性和位置。 #### 常用工具 - **Android Debug Bridge (ADB)**:用于在开发机器和Android设备...

Global site tag (gtag.js) - Google Analytics