文档章节

the method gdb+gdb server install

青春无极限
 青春无极限
发布于 2017/12/28 19:17
字数 1025
阅读 7
收藏 0

https://www.cnblogs.com/veryStrong/p/6240769.html

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:642: error: `PTRACE_GETSIGINFO' undeclared (first use in this function)
linux-arm-low.c:642: error: (Each undeclared identifier is reported only once
linux-arm-low.c:642: 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.5-glibc-2.3.6
# grep "PTRACE_GETSIGINFO" * -nR
arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO    0x4202
arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO    0x4202
distributed/arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO    0x4202
distributed/arm-linux/include/linux/ptrace.h:27:#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 0;
}

复制代码

   编译:

#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 = 751
Listening on port 2345

 

  注释:192.168.1.10:本开发板的ip

          123:端口号,自己随便写的

          ./test_debug:要调试的程序

3.3、在PC上输入:

    /bin/arm-linux-gdb ./test-debug
           target remote 192.168.183.127:2345

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也退出

   (8)  详细的GDB调试命令

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) 2012 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=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 748]
warning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.
warning: `/lib/ld-linux.so.2': Shared library architecture unknown is not compatible with target architecture arm.
Core was generated by `./test_debug'.
Program terminated with signal 11, Segmentation fault.
#0  0x000084ac in C (p=0x0) at test_debug.c:6
6               *p = 0x12;

复制代码

 

 

  4.4、bt:可以显示调用关系

 

#0  0x000084ac in C (p=0x0) at test_debug.c:6
#1  0x000084d0 in B (p=0x0) at test_debug.c:12
#2  0x000084f0 in A (p=0x0) at test_debug.c:17
#3  0x00008554 in main (argc=1, argv=0xbeb32eb4) at test_debug.c:34

© 著作权归作者所有

上一篇: spyder安装库
下一篇: #define
青春无极限
粉丝 2
博文 129
码字总数 71498
作品 0
卢湾
程序员
私信 提问
Shadowsocks Server And Client

Server sudo apt-get install python python-pippip install shadowsocksssserver -c /etc/shadowsocks/config.json -d start 其中 config.json的配置如下: { "server":"0.0.0.0","server_......

John
2018/10/16
0
0
Upgrade Lync 2013 Edge Server to Skype for Business (就地升级)

After upgrading our internal Lync 2013 Standard server to Skype for Business, I was keen to try out the Skype federation. Performing some research I discovered that the edge ser......

ganzy
2017/07/18
0
0
ubuntu安装配置shadowsocks server

安装 配置 找到shadowsocks文件夹: sudo find / -name shadows* 新建一个 config.json 具体含义: server 服务器 IP (IPv4/IPv6),注意这也将是服务端监听的 IP 地址 server_port 服务器端口...

唯慕清风
2015/08/24
6.1K
0
Install MySQL Server 5.6 in CentOS 6.x and Red Hat 6.x Linux

Install MySQL Server 5.6 in CentOS 6.x and Red Hat 6.x Linux In this tutorial we will learn how to install MySQL Server 5.6 in CentOS 6.x and RHEL 6.x by using yum command.The p......

寻知者
2016/12/24
14
0
WordPress 3.9 Released – Install Using LAMP or LEMP on RHEL, CentOS & Fedora

Well, on the internet you will find a number of good and better ways to install WordPress on Linux, but this installation guide is prepared for my future reference as well as fo......

Ericklee
2015/09/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Docker 可视化管理 portainer

官网安装指南: https://portainer.readthedocs.io/en/latest/deployment.html docker-compose.yml 位置,下载地址:https://downloads.portainer.io/docker-compose.yml...

Moks角木
32分钟前
2
0
Spring Security 实战干货:必须掌握的一些内置 Filter

1. 前言 上一文我们使用 Spring Security 实现了各种登录聚合的场面。其中我们是通过在 UsernamePasswordAuthenticationFilter 之前一个自定义的过滤器实现的。我怎么知道自定义过滤器要加在...

码农小胖哥
35分钟前
4
0
常见分布式事务解决方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务,这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇,很多互联网行业巨头、开源...

asdf08442a
36分钟前
2
0
influxdb continuous queries(cq)从入门到放弃

从前一篇influxdb的文章prometheus基于influxdb的监控数据持久化存储方案完成之后,就一直在折腾influxdb发布测试和生产环境的问题,经过接近2个月的验证,最终发现使用influxdb自带cq的方案...

狗陈
47分钟前
7
0
7.线程通信

在现实生活中,如果一个人团队正在共同完成任务,那么他们之间应该有通信,以便正确完成任务。 同样的比喻也适用于线程。 在编程中,要减少处理器的理想时间,我们创建了多个线程,并为每个线...

Eappo_Geng
53分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部