博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用GDB进行嵌入式远程调试
阅读量:7237 次
发布时间:2019-06-29

本文共 2800 字,大约阅读时间需要 9 分钟。

PC主机:Ubuntu 10.4 

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

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

使用nfs服务可以参考:

1. 概述

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

2. 安装GDB服务

下载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,程序如下:

 

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

使用交叉编译器编译该文件,使用-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    }

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

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

转载地址:http://zdwbm.baihongyu.com/

你可能感兴趣的文章
【备忘】EntityFramework 6 升级到 EntityFrameworkCore 注意点
查看>>
xilinx uboot网卡驱动分析
查看>>
Spring Boot系列之配置日志输出等级
查看>>
Java 底层机制(JVM/堆/栈/方法区/GC/类加载)
查看>>
原 在windows上创建文件名以“.”开头的文件
查看>>
实时流处理Storm、Spark Streaming、Samza、Flink孰优孰劣
查看>>
e297: write error in swap file
查看>>
并发错误:事务(进程 ID )与另一个进程已被死锁在 lock 资源上,且该事务已被选作死锁牺牲品...
查看>>
Ubuntu下搭建Hyperledger Fabric v1.0环境
查看>>
EventBus 3.0使用详解
查看>>
Linux curl 一例
查看>>
【docker】【redis】1.docker安装redis【单点redis服务】
查看>>
Oracle数据库导入导出 imp/exp备份还原
查看>>
react-native-storage + AsyncStorage 实现数据存储
查看>>
Cobaltstrike、armitage联动
查看>>
pandas set_index和reset_index的用法
查看>>
[Bash] View Files and Folders in Bash
查看>>
PEACHPIE 0.9.11 版本发布,可以上生产了
查看>>
异常检测——局部异常因子(Local Outlier Factor ,LOF)算法
查看>>
记录一次广州白云区项目数据库连接失败问题的解决过程
查看>>