PC主机:Ubuntu 10.4

目标板:TQ2440开发板,linux内核2.6.30

NOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦。

使用nfs服务可以参考:S3C2440挂载NFS文件系统

1. 概述

所谓远程调试,就是开发板上建立一个gdb服务端,同时待调试的程序也位于开发板,然后在PC机上使用gdb发起远程连接来进行调试。也就是说,在PC端调试开发板上的程序。请注意,在PC端需要包含被调试程序的符号调试信息(symbolic debug information),因此强烈建议使用NFS,否则需要两份被调试的应用程序,一份供gdb使用,另一份供gdbserver使用。

2. 安装GDB服务

下载gdb安装包,下载地址:http://ftp.gnu.org/gnu/gdb/

这里使用的是7.4。

解压安装包:

yj423@ubuntu:~/work_yj423$ tar -xvf gdb-7.4/

yj423@ubuntu:~/work_yj423/gdb-7.4$ pwd
/home/yj423/work_yj423/gdb-7.4

在开始编译之前,你必须知道你的交叉编译器的名字。我的交叉编译器是arm-unknown-linux-gnueabi-gcc,在下面将会用到该名字。

首先编译gdbserver,该程序运行在开发板上。

执行下列命令:

yj423@ubuntu:~/work_yj423/gdb-7.4$ cd gdb/gdbserver/
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ ./configure --host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ make

在make以后,会在当前目录下生成可执行文件gdbserver。

接着编译gdb,该程序运行在PC机上。

执行下列命令:

yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ cd ../../
yj423@ubuntu:~/work_yj423/gdb-7.4$ sudo ./configure --targe=arm-unknown-linux-gnueabi
yj423@ubuntu:~/work_yj423/gdb-7.4$ make

请注意执行命令时所在的目录。执行完以后会在gdb-7.4/gdb/下生成可执行文件gdb。我将gdb改命为armgdb。

3. 使用gdb调试

测试程序为hello.c,程序如下:

  1. #include <stdio.h>
  2. void main()
  3. {
  4. printf("hello world\n");
  5. printf("hello world\n");
  6. }

使用交叉编译器编译该文件,使用-g参数,生成hello。将gdbserver和hello复制到NFS的挂载点,我的挂载点为/home/yj423/nfswork。

yj423@ubuntu:~/nfswork$ ls
bin   dev  gdbserver  home  linuxrc  proc  sbin  tmp  var
boot  etc  hello      lib   mnt      root  sys   usr  welcome

可以看到gdbserver和hello。

接着,在开发板上使用NFS:
[root@yj423 /]#mount -o nolock 192.168.1.103:/home/yj423/nfswork /mnt/nfs
[root@yj423 /]#cd /mnt/nfs
[root@yj423 nfs]#ls
bin        dev        gdbserver  home       linuxrc    proc       sbin       tmp        var
boot       etc        hello      lib        mnt        root       sys        usr        welcome

然后执行gdbserver:

[root@yj423 nfs]#./gdbserver localhost:2001 hello
Process hello created; pid = 948
Listening on port 2001

2001为端口号,hello表示要调试的程序。此时gdbserver等待PC机进行链接。

在PC机上执行gdb:

yj423@ubuntu:~$ ./armgdb -q /home/yj423/nfswork/hello

Reading symbols from /home/yj423/nfswork/hello...done.

执行远程链接:

(gdb) target remote 192.168.1.6:2001
Remote debugging using 192.168.1.6:2001
warning: Unable to find dynamic linker breakpoint function.
GDB will be unable to debug shared library initializers
and track explicitly loaded dynamic code.
0x400007b0 in ?? ()
(gdb)

这里的192.168.1.6为开发板的IP地址。

至此PC端的gdb和开发板的gdbserver已经建立连接,接下来可以调试。

(gdb) b main
Cannot access memory at address 0x0
Breakpoint 1 at 0x83e0: file hello.c, line 5.
(gdb) c
Continuing.
warning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.
warning: Could not load shared library symbols for /lib/ld-linux.so.3.
Do you need "set solib-search-path" or "set sysroot"?
Breakpoint 1, main () at hello.c:5
5        printf("hello world\n");
(gdb) n
6        printf("hello world\n");
(gdb) n
7    }

这里只是简单的调试。后面还会有共享库调试和多进程调试,尽请期待!

未完待续~~~~~~~~~

使用GDB进行嵌入式远程调试的更多相关文章

  1. Gdb远程调试Linux内核遇到的Bug

    知识共享许可协议本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/gdb-bug 本博客同步在http://www.cn ...

  2. 学习4412开发板gdb和gdbserver的调试

    因为有很多的小伙伴是从单片机转过来的,用惯了单片机上的JLINK调试程序,换到Linux上非常的不习惯.确实,如果能设置断点,单步调试,查看变量,那确实是太爽了,那么在我们的Linux可以做到吗,答案 ...

  3. DM368 arm板GDB远程调试

    参考: http://www.erchashu.com/wiki/eclipse-cdt-gdb-arm-app-cross-debug 远程调试环境由宿主机GDB和目标机调试stub共同构成,两者通 ...

  4. GDB + gdbserver 远程调试android native code

    原文地址:GDB + gdbserver 远程调试android native code 作者:tq08g2z 以调试模拟器中的native library code为例. Host: ubuntuT ...

  5. 使用Visual Studio 利用WinGDB编译和远程调试嵌入式Linux的程序

    写这篇文章的目的在于帮助那些既要使用Visual Studio编写程序又要开发和调试嵌入式Linux 程序的苦命程序员们! 第一步, 安装 WinGDB ,下载位置  http://www.wingd ...

  6. gdbserver远程调试嵌入式linux应用程序方法

    此处所讲的是基于gdb和gdbsever的远程调试方法.环境为:PC机:win7.虚拟机:10.04.下位机:飞嵌TE2440开发板. 嵌入式linux应用程序的开发一般都是在linux里面编写好代码 ...

  7. Qtcreator远程调试出现“The selected build of GDB does not support Python scripting.It cannot be used .."

      版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/aristolto/article/details/77370853 之前使用的是Qt4.7后来换 ...

  8. CLion远程调试嵌入式开发板程序

    CLion远程调试嵌入式开发板程序 目录 CLion远程调试嵌入式开发板程序 1. 目的 2. 前提条件 3. CLion设置 3.1 设置一个Deployment 3.2 上传需要的目录到目标板子 ...

  9. ARM平台如何玩转GDB远程调试?

    前  言 关于GDB工具 GDB工具是GNU项目调试器,基于命令行使用.和其他的调试器一样,可使用GDB工具单步运行程序.单步执行.跳入/跳出函数.设置断点.查看变量等等,它是UNIX/LINUX操作 ...

随机推荐

  1. [论文笔记] CUDA Cuts: Fast Graph Cuts on the GPU

    Paper:V. Vineet, P. J. Narayanan. CUDA cuts: Fast graph cuts on the GPU. In Proc. CVPR Workshop, 200 ...

  2. 判断浏览器是否支持某些新属性---placeholder兼容问题解决

    function is_true(){ return 'placeholder' in document.createElement('input'); } 实例:placeholder在低版本IE浏 ...

  3. 洛谷 P1553 数字反转(升级版)

    P1553 数字反转(升级版) 题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调 ...

  4. Python - 字典(dict)删除元素

    字典(dict)删除元素, 能够选择两种方式, dict.pop(key)和del dict[key]. 代码 # -*- coding: utf-8 -*- def remove_key(d, ke ...

  5. Linux下读写芯片的I2C寄存器

    要想在Linux下读写芯片的I2C寄存器,一般需要在Linux编写一份该芯片的I2C驱动,关于Linux下如何编写I2C驱动,前一篇文章<手把手教你写Linux I2C设备驱动>已经做了初 ...

  6. 嵌入式 Linux应用程序如何读取(修改)芯片寄存器的值

    这一问题来自项目中一个实际的需求:我需要在Linux启动之后,确认我指定的芯片寄存器是否与我在uboot的配置一致. 举个例子:寄存器地址:0x20000010负责对DDR2的时序配置,该寄存器是在u ...

  7. 78.pipe多管道云端,客户端通信

    压力测试截图: 云端 定义管道缓存区大小,最多连接数量(线程个数),当前线程个数,管道名字 //缓冲区大小 #define SIZE 4096 //最多连接数量 #define MAX_CONNECT ...

  8. ConcurrentHashMap实现原理--转载

    原文地址:http://ajax-xu.iteye.com/blog/1104649 ConcurrentHashMap是Java 5中支持高并发.高吞吐量的线程安全HashMap实现.在这之前我对C ...

  9. Codeforces 919F. A Game With Numbers(博弈论)

      Imagine that Alice is playing a card game with her friend Bob. They both have exactly 88 cards and ...

  10. CISP/CISA 每日一题 七

    CISA 每日一题(答) 确保只有恰当授权的出站交易才能被处理,控制目的: 1.出站交易是基于授权而被启动: 2.出站交易包含了唯一的预先授权的交易类型: 3.出站交易只能被发送到合法的商业伙伴那里. ...