找回密码
 注册
关于网站域名变更的通知
查看: 227|回复: 1
打印 上一主题 下一主题

使用GDB进行嵌入式远程调试

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-6-16 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
PC主机:Ubuntu 10.4
9 r" ^2 r& h& v4 G/ l% ~
0 Y. @% w4 \4 Q0 d& p5 Y! c目标板:TQ2440开发板,linux内核2.6.30
3 d; X! w9 M& i. M
- ^/ m% |. i9 mNOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦。/ r) V3 z$ ]" Z4 N
& [0 L% k% g; H! F! Z
使用nfs服务可以参考:S3C2440挂载NFS文件系统
0 ?& z/ |) n. i; {" b7 \
! X  ^6 E+ ~/ n1. 概述
" F7 O! D4 i1 h% k! P3 k+ `0 _0 s所谓远程调试,就是开发板上建立一个gdb服务端,同时待调试的程序也位于开发板,然后在PC机上使用gdb发起远程连接来进行调试。也就是说,在PC端调试开发板上的程序。请注意,在PC端需要包含被调试程序的符号调试信息(symbolic debug information),因此强烈建议使用NFS,否则需要两份被调试的应用程序,一份供gdb使用,另一份供gdbserver使用。
+ g; J* {5 f; f( J
# g- m; m1 S/ n2 ~7 o1 a5 P2. 安装GDB服务/ M+ q5 C9 }( X" _6 c
下载gdb安装包,下载地址:http://ftp.gnu.org/gnu/gdb/
6 @# {/ C9 n+ B9 p9 F- F4 e2 o7 r1 r5 u1 i/ q5 o, ?
这里使用的是7.4。
+ S5 a& G5 ~- {2 c+ e9 E# F7 w# v
+ h9 N/ [+ I0 Q" {0 _/ r8 j解压安装包:
! s# K/ @! o1 J, `2 b$ W5 @3 {$ t) ]$ {$ j# Q. M* e1 ]
yj423@ubuntu:~/work_yj423$ tar -xvf gdb-7.4/) Y' q3 P% b. t% Q+ F) l; i
! a5 {4 E) h, M* L" U+ m
yj423@ubuntu:~/work_yj423/gdb-7.4$ pwd$ Y5 \8 [+ ]4 |1 R# m# S* e7 f
/home/yj423/work_yj423/gdb-7.4/ g& U7 e4 ]5 h1 Q  E; l
5 ~: b& O4 E  c. b: {8 o
在开始编译之前,你必须知道你的交叉编译器的名字。我的交叉编译器是ARM-unknown-linux-gnueabi-gcc,在下面将会用到该名字。
) \* m2 @; R1 J7 D  `9 p; x1 M( [0 q& N* @4 w1 d5 v

* H: S+ M! \, g' w+ f$ N8 r3 T9 P+ g- a; k& T9 Z1 T  [6 b
首先编译gdbserver,该程序运行在开发板上。
. g0 [0 {& |# p7 T) C
( y  A. q, _% k+ h# C, o执行下列命令:" m/ L) w4 o! s! G' h, q
% Z# ?1 ?$ _) ]% ]1 H& ?
yj423@ubuntu:~/work_yj423/gdb-7.4$ cd gdb/gdbserver/
4 e2 [0 _$ c* ]+ c# H& Uyj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ ./configure --host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab" {9 b+ N4 ^, X8 b$ C
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ make
9 F) b) W' j3 l! g8 L9 m
9 B9 e1 o9 b+ d' R0 ?5 N# }4 s在make以后,会在当前目录下生成可执行文件gdbserver。
* H, J: v* J/ u! i" _  E0 v8 i, f% s" R/ E0 j# y, }2 r
% J- M) B! E# Q" G' p$ }
4 j  x+ O$ ~. a4 e; b
接着编译gdb,该程序运行在PC机上。. Q$ U3 G% I( i' S( z( |. z: z; j, F

* C0 F3 u) e2 q% P% v执行下列命令:% k1 I5 e; s0 [6 ]) q% F
9 D, ^; v: H" y
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ cd ../../: I: a3 A9 N: ~
yj423@ubuntu:~/work_yj423/gdb-7.4$ sudo ./configure --targe=arm-unknown-linux-gnueabi8 k! y3 C, Y4 [
yj423@ubuntu:~/work_yj423/gdb-7.4$ make) B5 v' m' ?- t! j5 \$ u, V" w# v

0 B1 E( m; q' h5 Q  O7 J0 d# M1 ?' Y, ^请注意执行命令时所在的目录。执行完以后会在gdb-7.4/gdb/下生成可执行文件gdb。我将gdb改命为armgdb。( E' ~: z3 L* o5 S
% a# q0 ]* |& ^' @& ~: i+ b, i" \
3. 使用gdb调试
" _8 d! K2 q1 P% @. i8 w( z测试程序为hello.c,程序如下:
+ p$ _, Y% G" I/ T! X" h. ?) k8 ~! I+ @: J  }1 w
#include <stdio.h>
; y6 K7 t+ @- @) V  m+ L  G9 Z1 x  |% Q0 Z
void main()) |& b- N) K$ t- i
{' y5 X- T( [$ z/ g* n
        printf("hello world\n");
' d+ o; M  q; m* t8 W8 [, n1 b        printf("hello world\n");
5 L$ l: j8 q% P; U) X}) E* O, N9 o1 x# W
使用交叉编译器编译该文件,使用-g参数,生成hello。将gdbserver和hello复制到NFS的挂载点,我的挂载点为/home/yj423/nfswork。
1 v( H. h& T1 t5 W. E! R' |( |yj423@ubuntu:~/nfswork$ ls
1 ^% d& k1 {+ Xbin   dev  gdbserver  home  linuxrc  proc  sbin  tmp  var/ p+ I5 ?/ e' p$ u) ]) m
boot  etc  hello      lib   mnt      root  sys   usr  welcome# R& |+ E% a+ t

$ l  S# I! G# }, Y. S可以看到gdbserver和hello。! \  X/ C$ M6 l: V3 _/ Z

& d  Y/ [4 j/ M接着,在开发板上使用NFS:  G) G8 s& n4 M6 v' m" F% ]6 H) T# E
[root@yj423 /]#mount -o nolock 192.168.1.103:/home/yj423/nfswork /mnt/nfs
; e6 W! G! S  f( a9 d' \( v[root@yj423 /]#cd /mnt/nfs7 _& L0 U- \6 d2 S4 x
[root@yj423 nfs]#ls
0 P' y2 Z9 }" k/ ^" H0 _bin        dev        gdbserver  home       linuxrc    proc       sbin       tmp        var6 Z  J: X' f& c  B
boot       etc        hello      lib        mnt        root       sys        usr        welcome
% V0 n! F( e5 N& U; s  r/ a+ m. W; g' u
) Y# h) w1 \! G) e
然后执行gdbserver:6 b% y- A/ D6 p1 L3 ~
9 |+ \: U# [6 B
[root@yj423 nfs]#./gdbserver localhost:2001 hello
$ ]8 W$ ?0 d4 w  [. q% ]5 F9 p0 o, Y/ mProcess hello created; pid = 948, q8 P/ [8 d# l# e8 K) U
Listening on port 2001
2 ~( G5 A0 v6 e
0 _' g7 ?' t9 e+ ~8 V2001为端口号,hello表示要调试的程序。此时gdbserver等待PC机进行链接。
: n# L/ U+ t% i8 K8 q
; d$ a) R% H& K9 L! ~3 Z  n+ }% Q6 ^1 z
0 ?" X, p1 t0 G! G3 ^9 ^  p
在PC机上执行gdb:: v2 K8 ?. d( a9 O; q

6 e2 ~% p' w/ T- n# {* t4 v  |& q9 R$ r: k5 n# {- r" ^' k6 Q- Q" G& h; w
yj423@ubuntu:~$ ./armgdb -q /home/yj423/nfswork/hello  z/ i$ p) V7 B9 g3 r2 k3 Z0 o) }
Reading symbols from /home/yj423/nfswork/hello...done.
5 `2 p4 e- Y3 _$ S8 e" [* S- v+ b4 Z2 I0 v* r9 G; r2 H
执行远程链接:. M# g2 v8 ?8 d  a" S2 _2 H
$ N# u- `1 ]9 Q
(gdb) target remote 192.168.1.6:2001$ b  n* ?% }7 N' W7 [5 L; i
Remote debugging using 192.168.1.6:2001, V) |' R: O- H6 w( h4 M! w# L: v- e; e
warning: Unable to find dynamic linker breakpoint function.6 c6 t  W5 a% n! G2 p) O0 \7 P
GDB will be unable to debug shared library initializers
2 P' b/ p9 d1 Mand track explicitly loaded dynamic code.
8 z0 {: f/ G/ E/ b; F/ O: j  ~1 X0x400007b0 in ?? ()
. Z' g6 M$ O) J* B  k(gdb)  M* Y/ q4 H5 T8 [( b4 P! w7 f
* C' s( _" s- E/ p  O1 y3 d
这里的192.168.1.6为开发板的IP地址。7 f. R! |& n5 R* w0 D" b9 Q1 J

6 d, z: y, }' n( @! ~至此PC端的gdb和开发板的gdbserver已经建立连接,接下来可以调试。6 G9 p8 k2 G0 q) F5 ~

6 ~% ~# g1 n: a. U" b7 T7 Z(gdb) b main1 n' D) r' ]" |- X* A) ~/ K
Cannot access memory at address 0x0
; t# n. B# Q: J( {Breakpoint 1 at 0x83e0: file hello.c, line 5.( z; M8 V7 f8 p0 b- E+ O! N
(gdb) c
( ^$ D& g% O1 M1 t1 p+ AContinuing.  e8 V2 J& ?8 U! r
warning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm., ^  }) p" p* l+ L$ K2 s9 a
warning: Could not load shared library symbols for /lib/ld-linux.so.3.
$ N7 v+ g' C" {( H1 qDo you need "set solib-search-path" or "set sysroot"?
" @6 o. Z/ e" ^7 z; s* WBreakpoint 1, main () at hello.c:59 n# [  {- ?8 v& t# l
5        printf("hello world\n");
; `& L' f( Q0 V2 Z(gdb) n
0 f  t% J' Y# @' _5 k7 t. Y8 K6        printf("hello world\n");
  b, C4 k; p$ b: g(gdb) n3 d- x6 a) F) q8 c0 u3 A  U. J
7    }
; G- L) s! Y$ u$ A2 H
3 f" f* c4 q! g' _5 r这里只是简单的调试。后面还会有共享库调试和多进程调试,尽请期待!
( b8 S6 R1 x  R4 s% d% n: F0 }& u' t. j  ]; h9 h1 c, ~- Y
/ l6 X  ^7 j! H) }- G8 g8 D

  n+ s7 I; |2 W

该用户从未签到

2#
发表于 2020-6-16 18:31 | 只看该作者
使用GDB进行嵌入式远程调试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-25 21:22 , Processed in 0.187500 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表