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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
PC主机:Ubuntu 10.4
+ Z( i. Y% W. i7 A& D! t% r' ]$ R7 i7 }% D# `
目标板:TQ2440开发板,linux内核2.6.30, R8 d/ x7 ]- d9 `  a
" {/ C2 J* R0 l. Z7 G+ W% A4 R' u
NOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦。
3 }( P2 e( [. S; m1 x* a4 [8 ~% \
& @1 `) f$ Q* G/ c使用nfs服务可以参考:S3C2440挂载NFS文件系统* R: O7 q0 j% g" b% ?3 e

  }! X' J2 v, O0 D1. 概述6 e8 P7 {; M7 d* H9 M# U
所谓远程调试,就是开发板上建立一个gdb服务端,同时待调试的程序也位于开发板,然后在PC机上使用gdb发起远程连接来进行调试。也就是说,在PC端调试开发板上的程序。请注意,在PC端需要包含被调试程序的符号调试信息(symbolic debug information),因此强烈建议使用NFS,否则需要两份被调试的应用程序,一份供gdb使用,另一份供gdbserver使用。% Q$ g3 k& R9 q' L8 l$ O# Z
' {2 l. Z" m3 B: ^3 F
2. 安装GDB服务7 I# |! _1 s, A! A1 Q
下载gdb安装包,下载地址:http://ftp.gnu.org/gnu/gdb/
% l3 Q; ^; k! }# o0 _1 |# Z4 ^, p
& o2 o+ z6 k) s. A这里使用的是7.4。
1 n4 I- i7 e1 Z) C3 U" D
" o$ L. ^2 Y, M" ]6 s" Z4 L解压安装包:: S: W6 X0 d4 v1 P' a  y
/ L8 w1 c7 ]% s
yj423@ubuntu:~/work_yj423$ tar -xvf gdb-7.4/4 J3 q- V2 s% N; {4 _- g+ s7 J$ ?

: Q; b; ?6 H5 l8 j2 v) Oyj423@ubuntu:~/work_yj423/gdb-7.4$ pwd
4 R  a3 N! c, }6 K( X/home/yj423/work_yj423/gdb-7.4
. T$ C6 B/ `9 q
& Z8 D8 W* {6 J$ E1 ?1 o在开始编译之前,你必须知道你的交叉编译器的名字。我的交叉编译器是ARM-unknown-linux-gnueabi-gcc,在下面将会用到该名字。
" g- J; N: a( c5 t( Z$ X" |9 u9 ^
1 s1 e+ n  N4 R, i& M
0 j2 E' j- E( `) Q/ }( z- M+ W: L4 W, @, M% B; Y
首先编译gdbserver,该程序运行在开发板上。4 I1 Y/ q4 E, X2 t- P

+ m. Z& Y7 R. M" |% o执行下列命令:
4 |5 N; i" |5 j8 T. g( T. c' s5 z+ `* T4 n$ w5 r1 y! J5 a
yj423@ubuntu:~/work_yj423/gdb-7.4$ cd gdb/gdbserver/
' s6 ~6 }& [0 ], C9 N6 gyj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ ./configure --host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab
; x7 w' t$ h2 U( V! gyj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ make3 z& M- h& f. O: j2 c; _' d

9 `& e0 s, u- O3 y6 ]在make以后,会在当前目录下生成可执行文件gdbserver。" b8 O. C' j% [% P! E9 h5 U1 J

1 K- @' b& D9 U6 l" l6 {
6 E. h9 g0 g6 f& c  P7 v  u0 s, z  [
接着编译gdb,该程序运行在PC机上。
* J# B% K8 V% R8 }2 i
4 p& R* g+ A$ r# E9 @7 S执行下列命令:
3 O" n4 n5 d( L% ~- |' a+ e$ p/ C3 ~7 z/ K2 C% A, \, n
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ cd ../..// @1 [; E4 s8 P/ ~$ \
yj423@ubuntu:~/work_yj423/gdb-7.4$ sudo ./configure --targe=arm-unknown-linux-gnueabi# \6 q) p6 X& v( u; r! Y+ K3 L
yj423@ubuntu:~/work_yj423/gdb-7.4$ make
! D2 y9 J! }/ }4 ?6 t2 I4 Q3 e5 L$ I) b: y7 A* E
请注意执行命令时所在的目录。执行完以后会在gdb-7.4/gdb/下生成可执行文件gdb。我将gdb改命为armgdb。
+ G  Q% i9 K3 V4 p/ @' h( `; X; Z9 ?$ ]! g: s/ @0 K& V5 z1 c
3. 使用gdb调试
  H+ v' c6 f1 ?0 s4 F: ?测试程序为hello.c,程序如下:: r3 ~" \$ }" _$ @6 l6 \7 V. q$ g# }
% `9 W# d8 j/ ^
#include <stdio.h>
1 X5 n3 U* D$ I% c) W7 C$ A
/ O2 V+ [' c% j: C5 Z: L. J9 k. g( Rvoid main()
9 O2 G3 ~: ?' u1 d* Q1 F" g2 k{
- B2 W: g1 }4 H) @3 k        printf("hello world\n");9 q" x0 f4 [6 B9 t7 y- O. G
        printf("hello world\n");: \6 g% x- L1 a% q8 R+ D
}
' C& W  x+ O# S& q, G4 i使用交叉编译器编译该文件,使用-g参数,生成hello。将gdbserver和hello复制到NFS的挂载点,我的挂载点为/home/yj423/nfswork。
6 z# `) m1 l4 J4 ~$ _  Ryj423@ubuntu:~/nfswork$ ls
, R* i, J- r9 D1 Y/ D4 N) Vbin   dev  gdbserver  home  linuxrc  proc  sbin  tmp  var& T6 j& M4 q! x# J5 W# Q6 t
boot  etc  hello      lib   mnt      root  sys   usr  welcome
* p1 C. r8 b( I; N* ]
! `/ z& A- T0 B+ P* k, `! C可以看到gdbserver和hello。
* _2 a( x4 B" A7 M# ^  d/ n1 E
' g8 d8 c9 G( c接着,在开发板上使用NFS:5 m! o( S$ K/ d- P9 U: ?
[root@yj423 /]#mount -o nolock 192.168.1.103:/home/yj423/nfswork /mnt/nfs
6 M( b/ M8 X0 U+ y4 z/ o+ p[root@yj423 /]#cd /mnt/nfs/ g3 o( S6 O% P2 F( F! m; n. _
[root@yj423 nfs]#ls
/ f# d  L( p0 t: \+ G; ]/ [bin        dev        gdbserver  home       linuxrc    proc       sbin       tmp        var
' w. N' E& m! N+ E# q( d" Nboot       etc        hello      lib        mnt        root       sys        usr        welcome1 r# S: _8 f( w: l. r/ S
9 \  ?# ]# E; u6 y
2 e+ M6 W' q, R
然后执行gdbserver:4 U% G7 @) ~( S0 P
1 g1 G: h$ L: k" x) O  @1 j+ t
[root@yj423 nfs]#./gdbserver localhost:2001 hello
! R' r- E" I4 n0 Z$ ]4 J# D0 eProcess hello created; pid = 948
6 w# e5 a, X1 T0 s7 Q; B% [# NListening on port 2001+ Q2 j/ T: P+ f: Y2 c' V4 c

" f) I9 a# z7 s; u( W( O2001为端口号,hello表示要调试的程序。此时gdbserver等待PC机进行链接。
- e/ x) z; k; M/ R# w( @! t" J% a  r9 ?

2 ^1 P/ O* E2 I8 r9 ^# [$ C% f  d4 z4 z# t; C( ~0 ^- Z; z7 e/ m+ M
在PC机上执行gdb:
3 ]$ ~) m$ m9 e' ~* t& T  N) ?5 a4 Y) {1 i% q3 f% _
. B; o6 M$ r! Y& b  ]6 L& w
yj423@ubuntu:~$ ./armgdb -q /home/yj423/nfswork/hello! n0 V' {& n8 Y5 O
Reading symbols from /home/yj423/nfswork/hello...done.
2 K3 D' z8 P* [% p: l& O* @' s2 g& w, _& k: x1 v
执行远程链接:
3 M7 L3 `, g! d2 a: |& C/ m
2 u* f) X/ J, U% j1 a, K" L(gdb) target remote 192.168.1.6:2001
  o4 F+ F5 p9 j( u+ a6 zRemote debugging using 192.168.1.6:2001* k! k' H( h2 M  M- |
warning: Unable to find dynamic linker breakpoint function.
0 t( @$ K* q' O( v. ?2 [& j" l# yGDB will be unable to debug shared library initializers
. T) t9 i2 S% r2 Gand track explicitly loaded dynamic code.% m5 b  n! O* O+ B
0x400007b0 in ?? ()
' s5 {* Y) E! H/ J; w1 s(gdb)" P  M$ b8 J* Q% t, Y% u
6 E& J9 B6 ^# J: o! r0 E
这里的192.168.1.6为开发板的IP地址。. b  w5 l5 u4 V/ H/ }

, a, A9 G  J% `7 l% p至此PC端的gdb和开发板的gdbserver已经建立连接,接下来可以调试。
1 m: S  G$ s' h  T
. u2 v0 x; C" D" R  `! w# w% O(gdb) b main
; J1 }  p5 Z/ f0 G  w9 M) eCannot access memory at address 0x05 q; k+ m) C; J( K0 u; \
Breakpoint 1 at 0x83e0: file hello.c, line 5.
* t; O3 B; y; l(gdb) c
0 x1 C3 h9 c; _+ U) N" tContinuing.
" ~- R' N/ K( d4 S0 i% z0 M- xwarning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.8 i! g( x; x, D' @
warning: Could not load shared library symbols for /lib/ld-linux.so.3.
' L5 v9 J8 I- {2 E; j/ F! W  r5 q# [Do you need "set solib-search-path" or "set sysroot"?
% W! l0 X6 t' ?7 b! |6 v7 MBreakpoint 1, main () at hello.c:5
- o; U; C9 a5 P* T6 M( h  y* w5        printf("hello world\n");$ ?; I0 g5 T: F" X2 x( d2 U
(gdb) n/ |5 b) I$ ?) s
6        printf("hello world\n");
# d" `4 c. j' F(gdb) n6 y2 R. B: J: n' T! p8 o& Y
7    }* d! l1 d7 @0 x  `( @  x8 p5 P

( j( E& x- N. @" A4 }' @这里只是简单的调试。后面还会有共享库调试和多进程调试,尽请期待!
; N6 H7 |! b2 e3 l/ V6 c9 ~! m0 e. u* j: O* x7 p/ l9 k- F& }! j
( G! `+ @0 N$ c( a
" a' k9 w; I$ A/ w

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 17:37 , Processed in 0.171875 second(s), 23 queries , Gzip On.

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

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

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