1、调试原理

  GDB调试是应用程序在开发板上运行,然后在PC机上对开发板上得应用程序进行调试,PC机运行GDB,开发板上运行GDBServer。在应用程序调试的时候,pc机上的gdb向开发板上的GDBServer发出命令,而开发板上的gdbserver就会向应用程序发出信号,使应用程序停下来或者完成其他一些工作。

2、安装GDB和GDBServer(gdb-7.4.tar.bz2 )

  2.1、GDB  
    1、下载: http://ftp.gnu.org/gnu/gdb/ 
    2、解压:tar xvf gdb-7.4.tar.bz2
    3、配置:cd gdb-7.4/

                ./configure --target=arm-linux
    4、编译:make
    5、安装:mkdir tmp 
                make install prefix=$PWD/tmp
    6、拷贝:cp tmp/bin/arm-linux-gdb  /bin/
    7、查看版本 /bin/arm-linux-gdb -v (使用绝对路径使用gdb)
  2.2、GDBServer
    1、cd gdb/gdbserver/
    2、配置: ./configure --target=arm-linux --host=arm-linux
    3、编译: make CC=arm-linux-gcc
 
  2.3、编译GDBServer的时候会出现以下错误
linux-arm-low.c: In function `arm_stopped_by_watchpoint':
linux-arm-low.c:: error: `PTRACE_GETSIGINFO' undeclared (first use in this function)
linux-arm-low.c:: error: (Each undeclared identifier is reported only once
linux-arm-low.c:: error: for each function it appears in.)

  该错误是因为找不到PTRACE_GETSIGINFO宏,导致编译错误。我们到交叉编译链去搜索一下,我们交叉编译地址为 /work/tools/gcc-3.4.5-glibc-2.3.6

# cd  /work/tools/gcc-3.4.-glibc-2.3.
# grep "PTRACE_GETSIGINFO" * -nR
arm-linux/sys-include/linux/ptrace.h::#define PTRACE_GETSIGINFO 0x4202
arm-linux/include/linux/ptrace.h::#define PTRACE_GETSIGINFO 0x4202
distributed/arm-linux/sys-include/linux/ptrace.h::#define PTRACE_GETSIGINFO 0x4202
distributed/arm-linux/include/linux/ptrace.h::#define PTRACE_GETSIGINFO 0x4202

  可以看到,在交叉编译链里面,定义了PTRACE_GETSIGINFO宏为0x4202,头文件为include<linux/ptrace.h>中。

  有两种解决办法,可任选其一:

  ① 在linux-arm-low.c中直接添加宏 #define PTRACE_GETSIGINFO 0x4202

  ② 在linux-arm-low.c中将#include <sys/ptrace.h> 更改为 #include <linux/ptrace.h>

  再次编译,编译通过。

  2.4、将gdbserver拷贝到开发板的bin目录下
#cp gdbserver /work/nfs_root/first_fs/bin

3、调试

  3.1、在编译要进行调试的应用程序 加上 -g
   测试程序如下(test_debug.c)
  

#include <stdio.h>

void C(int *p)
{
*p = 0x12;
} void B(int *p)
{
C(p);
}
void A(int *p)
{
B(p);
}
void A2(int *p)
{
C(p);
}
int main(int argc, char **argv)
{
int a;
int *p = NULL;
A2(&a); // A2 > C
printf("a = 0x%x\n", a);
A(p); // A > B > C
return ;
}

  编译:

#arm-linux-gcc -g -o test_debug test_debug.c
3.2、在开发板上:
  打印出如下信息:

#gdbserver 192.168.1.10:123 ./test_debug
Process ./test_debug created; pid =
Listening on port
  注释:192.168.1.10:本开发板的ip
          123:端口号,自己随便写的
          ./test_debug:要调试的程序
3.3、在PC上输入:
    /bin/arm-linux-gdb ./test-debug
target remote 192.168.183.127:
3.4、正式调试!介绍几个常用的命令
  (1)l:列出所有源代码
  (2)break main:在main处打断点
          break test_debug.c:11:在test_debug.c的11行打断点
  (3)c:运行到断点处
  (4)step:单步执行
  (5)next:单步执行,但是step会进入函数里面,但是next不会
  (6)print a:打印a这个变量的值
  (7)quit:退出,输入此命令则开发板上的gdbserver也退出

4、另外一种调试方法

  让程序在开发板上直接运行,当它发生错误时,令它产生core dump文件,然后使用gdb根据core dump文件找到发生错误的地方
 
  在ARM板上:
  4.1、 ulimit -c unlimited
  4.2、 执行应用程序 : 程序出错时会在当前目录下生成名为core的文件
 
  在PC上:
  4.3、首先将core文件拷贝到pc机上
       然后:/bin/arm-linux-gdb ./test_debug ./core
 
  打印出如下信息:

GNU gdb (GDB) 7.4
Copyright (C) Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 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=i686-pc-linux-gnu --target=arm-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/share/jz2440/test_debug...done.
[New LWP ]
warning: `/lib/libc.so.': Shared library architecture unknown is not compatible with target architecture arm.
warning: `/lib/ld-linux.so.': Shared library architecture unknown is not compatible with target architecture arm.
Core was generated by `./test_debug'.
Program terminated with signal , Segmentation fault.
# 0x000084ac in C (p=0x0) at test_debug.c:
*p = 0x12;
 
  4.4、bt:可以显示调用关系
 
#  0x000084ac in C (p=0x0) at test_debug.c:
# 0x000084d0 in B (p=0x0) at test_debug.c:
# 0x000084f0 in A (p=0x0) at test_debug.c:
# 0x00008554 in main (argc=, argv=0xbeb32eb4) at test_debug.c:

linux应用调试技术之GDB和GDBServer的更多相关文章

  1. Linux应用调试 :使用gdb和gdbserver进行远程调试

    一.引言 在日常程序开发中不免遇到类似空指针操作导致程序崩溃的问题,所以需要一定的手段去定位bug,而断点调试是普遍使用的技巧,比如Windows中用VC++的debug模式进单步运行.断点调试等,而 ...

  2. 嵌入式Linux的调试技术

    本节我们研究嵌入式Linux的调试技术,对于复杂的Linux驱动及HAL等程序库,需要使用各种方法对其进行调试.刚开始讲了打印内核调试信息:printk,这个函数的用法与printf函数类似,只不过p ...

  3. Linux kprobe调试技术使用

    kprobe调试技术是为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术. 利用kprobe技术,可以在内核绝大多数函数中动态插入探测点,收集调试状态所需信息而基本不影响原有执行流程. kpr ...

  4. Linux内核调试技术——jprobe使用与实现

    前一篇博文介绍了kprobes的原理与kprobe的使用与实现方式,本文介绍kprobes中的另外一种探測技术jprobe.它基于kprobe实现,不能在函数的任何位置插入探測点,仅仅能在函数的入口处 ...

  5. 第十章 嵌入式Linux的调试技术

    对调试工具进行简介.Linux中提供了一类工具,通过这些工具可以逐行跟踪程序的代码,用于测试用户空间程序的gdb.gdbserver和调试内核空间程序的kgdb. 用gdb调试用户空间程序:gdb可跟 ...

  6. 第10章 嵌入式Linux 的调试技术

    10.1  打印内核调试信息:printk printk位函数运行在内核空间, printf函数运行在用户空间.也就是说,像Linux 驱动这样的Linux内核程序只能使用printk函数输出调试信息 ...

  7. linux内核调试技术之printk

    原创博客:欢迎转载,转载请注明出处https://i.cnblogs.com/EditPosts.aspx?postid=6218383 1.简介(基于s3c2440 linux) 在内核调试技术之中 ...

  8. Linux高级调试与优化——gdb调试命令

    番外 2019年7月26日至27日,公司邀请<软件调试>和<格蠹汇编——软件调试案例集锦>两本书的作者张银奎老师进行<Linux高级调试与优化>培训,有幸聆听张老师 ...

  9. 第10章 嵌入式Linux的调试技术

    printk函数运行在内核空间,printf函数运行在用户空间.也就是说像Linux驱动这样的Linux内核程序只能使用printk函数输出调试信息.printk函数在控制台(也称终端)显示消息是通过 ...

随机推荐

  1. [C#] async 的三大返回类型

    async 的三大返回类型 序 博主简单数了下自己发布过的异步文章,已经断断续续 8 篇了,这次我想以 async 的返回类型为例,单独谈谈. 异步方法具有三个可让开发人员选择的返回类型:Task&l ...

  2. 学点HTTP知识

    不学无术 又一次感觉到不学无术,被人一问Http知识尽然一点也没答上来,丢人丢到家了啊.平时也看许多的技术文章,为什么到了关键时刻就答不上来呢? 确实发现一个问题,光看是没有用的,需要实践.看别人说的 ...

  3. SQLSERVER走起微信公众帐号已经开通搜狗微信搜索

    SQLSERVER走起微信公众帐号已经开通搜狗微信搜索 请打开下面链接 http://weixin.sogou.com/gzh?openid=oIWsFt-hiIb_oYqQHaBMoNwRB2wM ...

  4. SSH实战 · 唯唯乐购项目(下)

    后台模块 一:后台用户模块 引入后台管理页面 创建adminuser表: CREATE TABLE `adminuser` (   `uid` int(11) NOT NULL AUTO_INCREM ...

  5. HTML 获取屏幕、浏览器、页面的高度宽度

    本篇主要介绍Web环境中屏幕.浏览器及页面的高度.宽度信息. 目录 1. 介绍:介绍页面的容器(屏幕.浏览器及页面).物理尺寸与分辨率.展示等内容. 2. 屏幕信息:介绍屏幕尺寸信息:如:屏幕.软件可 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(76)-微信公众平台开发-网页授权

    前言 网页授权是:应用或者网站请求你用你的微信帐号登录,同意之后第三方应用可以获取你的个人信息 网上说了一大堆参数,实际很难理解和猜透,我们以实际的代码来演示比较通俗易懂 配置 实现之前我们必须配置用 ...

  8. [原] 利用 OVS 建立 VxLAN 虚拟网络实验

    OVS 配置 VxLAN HOST A ------------------------------------------ | zh-veth0(10.1.1.1) VM A | | ---|--- ...

  9. Maven 代理设置

    在maven的安装目录下 %MAVEN_HOME%/conf/setting.xml 中进行设置 <proxies>    <!-- proxy     | Specificatio ...

  10. MVC还是MVVM?或许VMVC更适合WinForm客户端

    最近开始重构一个稍嫌古老的C/S项目,原先采用的技术栈是『WinForm』+『WCF』+『EF』.相对于现在铺天盖地的B/S架构来说,看上去似乎和Win95一样古老,很多新入行的,可能就没有见过经典的 ...