zoukankan      html  css  js  c++  java
  • 29、应用调试之使用GDB来调试应用程序

    说明:gdb可以实现源代码单步调试 

    原理:

    1、gdb在PC机上运行,gdbserver在arm开发板上运行,gdbserver在开发板上相当于父进程,应用相当于子进程,PC上gdb发命令给gdbserver,gdbserver在发命令给应用子进程

    2、gdb在运行的时候需要一个带有调试信息的app文件,比如gdb要读应用中某个变量的值,这个文件就提供了变量的地址

    (eclipse是一种gdb前台图像界面工具,有空可以研究下)

    编译gdb,gdbserver
    tar xjf gdb-7.4.tar.bz2
    cd gdb-7.4/
    ./configure --target=arm-linux(target指的意思是用于arm版,host指的意思是运行环境,默认是PC,在这里可以不用设置)
    make(make  install prefix=$PWD/tmp )
    把arm-linux-gdb(如果make的时候安装到/tmp目录下时,其在tmp下的bin下面)复制到/bin目录

    cd gdb/gdbserver/
    ./configure --host=arm-linux

    make

    报错:提示linux-arm-low.c 中PTRACE_GETSIGINFO undeclared未定义

    进入交叉编译工具链中执行grep “PTRACE_GETSIGINFO” *nR,发现在include/linux/ptrace.h中有定义,查看linux-arm-low.c,发现其是include <sys/ptrace.h>,包含的有问题,改为<linux/ptrace.h>
    cp gdbserver /work/nfs_root/first_fs/bin

    编译要调试的应用程序,编译时加上-g选项,用于生成gdb需要的应用程序调试信息,信息和程序包含在一起

    调试:
    1. 在ARM板上
    gdbserver 192.168.1.17:2345 ./test_debug //2345端口随便写,ip是开发板自己的ip

    2. 在PC上
    /bin/arm-linux-gdb ./test_debug
    输入:target remote 192.168.1.17:2345
    然后: 使用gdb命令来控制程序

    l命令是list的意思,会打印全部应用程序源码

    break 函数名  其会函数中变量定义下面打上断点,支持c命令,运行(continue)

    break 应用名.c:行号,可以在文件中第几行打上断点

    step  单步执行,遇到函数会进入函数   next 单步执行,不会进一个函数  nexti执行下一条汇编

    print 变量  会打印变量的值


    另一种方法:
    让程序在开发板上直接运行,当它发生错误时,令它产生core dump文件
    然后使用gdb根据core dump文件找到发生错误的地方
    在ARM板上:
    1. ulimit -c unlimited(设置core文件的大小)
    2. 执行应用程序 : 程序出错时会在当前目录下生成名为core的文件

    在PC上:
    3. /bin/arm-linux-gdb ./test_debug ./core 会直接运行,并打印出错信息
    4、在执行 backstrace或者backtrace指令可以参看出错的函数调用关系,命令简写bt

  • 相关阅读:
    Introspector
    jython awt demo
    java中dom解析xml
    【luogu1816】忠诚
    代码调试技巧【OI缩水版】
    【UOJ78】二分图最大匹配
    【51nod】最大子段和
    【LibreOJ109】【模板】并查集
    简单的卡常数【OI缩水版】
    QQbot
  • 原文地址:https://www.cnblogs.com/liusiluandzhangkun/p/8681875.html
Copyright © 2011-2022 走看看