zoukankan      html  css  js  c++  java
  • ndk学习6: 使用gdb调试ndk程序一


    生成debug版程序

    方法一:

    使用ndk-build编译时,加上如下参数NDK_DEBUG=1,之后生成so文件之外,还会生成gdbobserver,gdb.setup调式文件

     

    方法二:

    修改AndroidManifest.xml文件,增加debuggable属性为true

        <application android:debuggable="true"  ...

    Eclipse报错则在错误信息上点右键 Quickly fix 忽略掉错误即可

     

    编译之后会生成和调试相关的文件如下:

     

    libs目录下的gdbserver需要拷贝到虚拟机

    gdb.setup是设置和符号相关的路径

    obj下面的Hello是符号相关的路径

     

    方法三:

    在application.mk中加入

    APP_OPTIM := debug

    NDK_DEBUG = 1  

    只会生成调试的符号文件,对应版本的gdbsever还需要自己从ndk中拿出来

     

    启动调试

    我们以x86的模拟器作为调试目标,首先编译x86版本的可执行文件

    在工程目录下新建一个makefile文件

    编写调试脚本如下:

    MODALE_NAME := Hello

       

    # x86 path

    X86_TOOLS_PATH :=E:Androidandroid-ndk-r10b oolchainsx86-4.6prebuiltwindows-x86_64in

    X86_GDB_PATH := $(X86_TOOLS_PATH)i686-linux-android-gdb.exe

    X86_GDB_SERVER := E:Androidandroid-ndk-r10bprebuiltandroid-x86gdbservergdbserver

       

    run_x86:

        adb push .libsx86$(MODALE_NAME) /data/local/tmp

        adb shell chmod 755 /data/local/tmp/$(MODALE_NAME)

        adb shell /data/local/tmp/$(MODALE_NAME)

       

    debug_x86:

        adb forward tcp:12345 tcp:12345

        adb push $(X86_GDB_SERVER) /data/local/tmp

        adb shell chmod 777 /data/local/tmp/gdbserver

        adb push .objlocalx86$(MODALE_NAME) /data/local/tmp

        adb shell chmod 777 /data/local/tmp/$(MODALE_NAME)

        adb shell /data/local/tmp/gdbserver :12345 /data/local/tmp/$(MODALE_NAME)

       

    client_x86:

        $(X86_GDB_PATH) .objlocalx86$(MODALE_NAME)

    # 1. target remote localhost:12345

    # 2. gdb.setup

     

     

    debug子过程:

    大致的流程就是把gdbserver和debug版本程序拷贝到手机或者模拟器里面

    给予可执行权限,然后用手机里面的gdbserver启动程序 等待PC上的gdb连接

     

     

    client子过程:

    就是连接手机中的gdb开始调试

     

     

    然后执行make debug 服务端即开始等待客户端调试器的连接

    出现Listen就对了

     

     

    在换一个shell 输入make client 

    进入gdb界面后输入target remote localhost:12345

    报错:找不到动态链接库,这是没有设置gdb.setup的原因

     

     

    解决方案:

    libs/x86目录下的gdb.setup中的2行命令放到gdb(client)中执行就好

     

     

    如下图设置就好:

     

    然后就可以开始调试了

     

    注意:

    1.如果模拟器是基于x86架构的 那么gdbserver也必须使用x86 

    2.如果你的工程的ABIarmeabi-v7a, 那么libs目录下的gdbserver也是armeabi-v7a

     

     

    GDB简易使用

    gdb命令比较多,简单的介绍几个常用的命令:

    list(l) 用来查看代码

    break line_num(b)  用于对指定的代码行下断点

    info breakpoint 用于查看断点信息

    run命令用于执行程序

    next (n) 单步步过

    step (s) 单步步入

    continue (c) 执行到下一个断点

    print 查看变量的值

    backtrace 函数栈信息

    clear 删除暂停处的断点

    delete 删除一个断点

    info func 显示函数信息

    info local 显示当前函数的局部变量信息

    q命令退出调试

     

     

     

  • 相关阅读:
    结对编程(阶段二)
    结对编程 第一阶段
    Git实验
    webpack02
    webpack01
    实验五 单元测试
    实验四 代码审评
    UML建模工具的安装和使用
    实验二 结对编程(阶段二)
    博客园背景的修改
  • 原文地址:https://www.cnblogs.com/bingghost/p/5731020.html
Copyright © 2011-2022 走看看