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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
PC主机:Ubuntu 10.4
+ A4 O# j' i5 o) r5 L8 N8 j9 O
( j; d; l, j7 [5 s: K目标板:TQ2440开发板,linux内核2.6.30
! _) u; I5 ~7 {0 F3 w( n% x
9 `' ]2 z4 {* i4 j( p* V" \3 d3 ZNOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦。
: C8 b1 A% E- S' a  m
) j0 k; G+ h3 Z) I! w, c% @使用nfs服务可以参考:S3C2440挂载NFS文件系统$ w  m/ Z7 L1 C4 U' A# N

" v% r9 S( b$ k% o7 v1. 概述' Y/ i0 y; O! Y+ o; b9 G5 M9 }7 i
所谓远程调试,就是开发板上建立一个gdb服务端,同时待调试的程序也位于开发板,然后在PC机上使用gdb发起远程连接来进行调试。也就是说,在PC端调试开发板上的程序。请注意,在PC端需要包含被调试程序的符号调试信息(symbolic debug information),因此强烈建议使用NFS,否则需要两份被调试的应用程序,一份供gdb使用,另一份供gdbserver使用。! a1 A. x1 f6 ^, B$ ?8 ]% y  Y
# e2 a: F% P6 @3 y! G: E( o
2. 安装GDB服务
! ^0 K  x3 W3 V* v下载gdb安装包,下载地址:http://ftp.gnu.org/gnu/gdb/ $ l# Q) K* O7 x. Z8 F
. r6 o' a! k& u6 u' ]% F; E
这里使用的是7.4。
6 _7 ?1 A' r1 f. A% [+ c
8 ]( R! b  s& p! r解压安装包:
. S1 Z8 S$ j' p, i1 c7 A5 @: e
! g3 b5 Y2 h5 ^) j- c! [7 Wyj423@ubuntu:~/work_yj423$ tar -xvf gdb-7.4/$ ^3 E% y, `) n8 j0 }

( W+ R6 }, w/ F2 iyj423@ubuntu:~/work_yj423/gdb-7.4$ pwd
- `* @; n+ h4 a- o, s8 e* \" C/home/yj423/work_yj423/gdb-7.43 O/ }3 H( s2 G- G1 ]

/ A. J; h1 z% H! B: r6 w在开始编译之前,你必须知道你的交叉编译器的名字。我的交叉编译器是ARM-unknown-linux-gnueabi-gcc,在下面将会用到该名字。& \! m* C3 c8 h- K; U( L) u
% G+ o" e* c5 u. e' L

  y/ l$ o9 D& x1 y$ _+ x  |) I8 K2 U' p
4 y, q: F1 B( A& I% N. h首先编译gdbserver,该程序运行在开发板上。( \' E" {* V0 s/ ?; f0 [
* n7 y5 G7 J0 ^* o' T) w
执行下列命令:) l7 u2 H: d9 N. L) D( C* r

- P- ^3 R$ {2 X( h5 w7 kyj423@ubuntu:~/work_yj423/gdb-7.4$ cd gdb/gdbserver/! d# W" d) M2 n9 a( C; i, U0 J
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ ./configure --host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab
& u! J  [3 b$ a+ q6 C' F- ayj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ make3 T# f5 R* Q' a; @/ v& J
, B8 e& g/ Q& Z6 x/ Z5 ~& ~
在make以后,会在当前目录下生成可执行文件gdbserver。
( Q7 u7 K: D& J( L6 w
$ o# t+ F8 B) G5 E2 p8 E7 G+ @) R/ [- ?0 c$ ~0 t8 E6 L- X7 V

0 `( O/ k2 X3 T3 s接着编译gdb,该程序运行在PC机上。
6 I6 M5 Y4 M" K( n# f. w9 @
" q  |; X/ z( o9 O执行下列命令:
- H! B3 w3 D8 |5 d6 V7 r9 ]" A% K, I: G4 Q% w
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ cd ../../- P: T  a+ Q4 m+ o! p; }; W
yj423@ubuntu:~/work_yj423/gdb-7.4$ sudo ./configure --targe=arm-unknown-linux-gnueabi
) R5 e& Q# f3 Y8 H0 _4 |! e' Uyj423@ubuntu:~/work_yj423/gdb-7.4$ make- s& r7 w0 R3 s

: }$ B8 Q7 x2 H请注意执行命令时所在的目录。执行完以后会在gdb-7.4/gdb/下生成可执行文件gdb。我将gdb改命为armgdb。0 n) B" v, e1 s1 z9 \' q: f

2 R$ `7 P2 a# V+ y1 h7 Y$ H3. 使用gdb调试
7 ?- J9 V6 g# l8 j: R) J" _( M测试程序为hello.c,程序如下:
5 `, r" A9 j% k/ j
/ R( F+ m6 ^# J9 E#include <stdio.h>
' B! j% i. y9 [% ~/ ?* X- p* ~. q1 z3 o5 E
void main()0 H9 Z/ O8 D7 ~  }, x/ W
{
" g! P) v. q7 V; g# A  Y, X        printf("hello world\n");
! {* B5 b" Q( I" ]* W        printf("hello world\n");
- v6 h4 Q. n7 N* S4 X}: v; ~4 Z1 {* e
使用交叉编译器编译该文件,使用-g参数,生成hello。将gdbserver和hello复制到NFS的挂载点,我的挂载点为/home/yj423/nfswork。
9 w3 A' C: N) B! m  cyj423@ubuntu:~/nfswork$ ls
) U1 j0 y) F/ K7 t" c  Mbin   dev  gdbserver  home  linuxrc  proc  sbin  tmp  var7 r+ e# e0 S) M: H: v
boot  etc  hello      lib   mnt      root  sys   usr  welcome5 t8 x3 p; A5 ~4 _  \$ w4 C! M

2 M( k1 b* u2 X* U* q0 T1 W! a) K可以看到gdbserver和hello。
( d2 X& ]4 U0 B# w% m3 j
: g- K6 p4 l, l# z接着,在开发板上使用NFS:
) B* J: A, r4 p: @5 h[root@yj423 /]#mount -o nolock 192.168.1.103:/home/yj423/nfswork /mnt/nfs
& |) r) h3 O3 P0 y7 F  X[root@yj423 /]#cd /mnt/nfs5 z- `* x% {  S; h- u1 U4 R, h1 I
[root@yj423 nfs]#ls
+ y, V! n  \2 h! Ybin        dev        gdbserver  home       linuxrc    proc       sbin       tmp        var
% Z3 [6 z1 A2 Y3 {/ M3 Uboot       etc        hello      lib        mnt        root       sys        usr        welcome
* x* f; y* m) r- q
* z% O/ Q0 o- w5 F# U6 H" v' B: L4 @  T1 K
然后执行gdbserver:! f' ~$ u, Y0 X3 e( b, \7 F8 G" t; i
/ Y, I6 V: M- ?4 ?0 k
[root@yj423 nfs]#./gdbserver localhost:2001 hello( |% e% a) |# Y7 e% i' l# l
Process hello created; pid = 948
. z2 l9 F! {" Q( e2 |Listening on port 2001
* M4 U6 p# h8 s: e5 @: L( e! r. ]3 ^, @% i4 A
2001为端口号,hello表示要调试的程序。此时gdbserver等待PC机进行链接。
/ e6 V9 a6 e* b/ G, W* U+ O; u* @7 l" p+ [$ Q5 {8 X% T- B  _$ a

2 |- ~( f, V8 ^/ ^
8 V' r4 N1 r% e: [( Y在PC机上执行gdb:
! A- j3 y: a& Q* a3 r
  ~! }2 r# R* c+ n1 T: n+ }2 [% x8 P- ?- X6 o: g- q' s6 L7 k
yj423@ubuntu:~$ ./armgdb -q /home/yj423/nfswork/hello
' x. t  m* \5 S0 N* f, y# H  hReading symbols from /home/yj423/nfswork/hello...done.
4 O4 `0 g; Z1 V0 m' R% `  a. g% W: B. B1 Z; [( T
执行远程链接:* }* F+ b0 H- [7 h1 T1 @( N
4 J; L- x$ c/ X! p
(gdb) target remote 192.168.1.6:2001
( L* l& ?( S" D+ M2 XRemote debugging using 192.168.1.6:2001: M5 l& P+ ?" w) y7 `) Y
warning: Unable to find dynamic linker breakpoint function.
0 _7 B) u7 s# e# s4 B3 Q3 T4 H; h$ t& wGDB will be unable to debug shared library initializers" I4 }% E/ x8 z6 q& R
and track explicitly loaded dynamic code.. O5 H) l, U6 @3 k$ Y
0x400007b0 in ?? ()+ D8 j% x4 b" `- l3 C. \
(gdb)
( A$ s/ W: l# O+ J+ ^+ f
. q$ w: v( o* Q9 a这里的192.168.1.6为开发板的IP地址。% a, S" |. u% d6 {
& ]  G! e" B* W; D' Y
至此PC端的gdb和开发板的gdbserver已经建立连接,接下来可以调试。0 B8 m, G* t0 e/ L
, P7 B9 j0 j" A- S1 S! {
(gdb) b main6 ~% N$ g( L. ^0 s" F
Cannot access memory at address 0x0/ r4 E* ?0 H2 Y$ O3 R
Breakpoint 1 at 0x83e0: file hello.c, line 5.
6 h2 Y& M$ X' w2 o(gdb) c
! s$ `4 |( ]/ Y/ cContinuing.
) X2 G# w+ L$ v$ k, C, Twarning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.) ~6 B8 O( A$ ?2 I  J* P8 Z6 Q/ O
warning: Could not load shared library symbols for /lib/ld-linux.so.3.
: j6 P) Y; p8 e  n  }- DDo you need "set solib-search-path" or "set sysroot"?
$ E) e1 D# e3 H+ V& t! e6 @Breakpoint 1, main () at hello.c:5
) ]+ E! V# D7 _- s0 i2 e1 u5        printf("hello world\n");
; s. e: d7 ^9 E(gdb) n: e3 ]! e( h) d# \  B$ n; d! C
6        printf("hello world\n");
: Z) Z' {  p' p1 a; k* P& N(gdb) n# L  ]- f9 J4 j" [" E9 B* \( V
7    }
3 }1 b: r1 E5 E: p/ h0 T- I$ n. P
# g) g7 y( Q7 e8 s# F8 T# p5 M这里只是简单的调试。后面还会有共享库调试和多进程调试,尽请期待!
9 @( D5 l  N" {/ v: ]) z, U% R! Q: J' Q8 `. D/ ^8 `( U

: g3 }4 L5 I5 l4 S: ]5 K6 o. {; _% U/ J& \) T  w" @3 b& a

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-14 13:31 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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