EDA365电子论坛网

标题: 使用GDB进行嵌入式远程调试 [打印本页]

作者: pulbieup    时间: 2020-6-16 16:49
标题: 使用GDB进行嵌入式远程调试
PC主机:Ubuntu 10.4 # v' F- ^* Q& Y+ m" `2 `1 i
+ A+ L- C: X2 M" P2 k4 p% e/ I
目标板:TQ2440开发板,linux内核2.6.30: e! n1 n7 r. l" |% W7 V
/ e  |1 c+ z% \! C+ ?. E
NOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦。, R0 g) a3 p- ^
: X* n1 h, a7 T7 N3 _- Y9 O* U1 q" `
使用nfs服务可以参考:S3C2440挂载NFS文件系统
) U  N1 }0 V) Z5 D3 o4 O5 b; z2 n: T! n7 E2 d9 H) O
1. 概述
$ n1 Y, V1 n) K4 X" K, R  u) H; ?所谓远程调试,就是开发板上建立一个gdb服务端,同时待调试的程序也位于开发板,然后在PC机上使用gdb发起远程连接来进行调试。也就是说,在PC端调试开发板上的程序。请注意,在PC端需要包含被调试程序的符号调试信息(symbolic debug information),因此强烈建议使用NFS,否则需要两份被调试的应用程序,一份供gdb使用,另一份供gdbserver使用。
9 L( r" h  P0 N7 d0 P# K. D7 e9 m7 g
2. 安装GDB服务& M* x) N6 x/ D% ^* u* V
下载gdb安装包,下载地址:http://ftp.gnu.org/gnu/gdb/ . i' X7 K7 n5 c8 A5 {, H

5 S" ?8 n# Y6 X/ N这里使用的是7.4。+ y" Z6 C5 b8 F4 l2 ^* Z
( n9 Q/ c4 w* F. N# v+ v& U
解压安装包:3 H3 b$ A' h" D: m

: S" w+ l- W) e' j: w$ \$ a' C) cyj423@ubuntu:~/work_yj423$ tar -xvf gdb-7.4/0 G) v" w0 k) ~4 m% y+ \, l
! X4 ?1 D  c: i
yj423@ubuntu:~/work_yj423/gdb-7.4$ pwd3 B; Z4 D: m! H, u
/home/yj423/work_yj423/gdb-7.4
0 Y2 ^' |- C+ Z
: [1 i( H3 a( X2 t0 q在开始编译之前,你必须知道你的交叉编译器的名字。我的交叉编译器是arm-unknown-linux-gnueabi-gcc,在下面将会用到该名字。2 G3 M7 E# s' |: H1 T$ r
$ d) }9 _  u3 v: k) T8 O

4 y2 h" v/ V7 s1 s# u7 f2 w7 y& \+ p, s9 o
首先编译gdbserver,该程序运行在开发板上。4 }. [+ R2 [9 F" c# G
$ u9 C* b1 F, Q7 N  Y! M
执行下列命令:
, |2 u; b. M  j( I+ b4 x4 }9 Z/ z7 r2 i7 c6 H
yj423@ubuntu:~/work_yj423/gdb-7.4$ cd gdb/gdbserver/
9 O9 d* @5 b- D: ?7 [* Uyj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ ./configure --host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab
* K3 q+ I# |  L' ryj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ make, S7 Y0 k0 L/ N2 e$ [

4 B7 H4 |$ C$ Z$ q9 \5 E+ e) V在make以后,会在当前目录下生成可执行文件gdbserver。% @" i6 D7 }* K
/ b$ o& \$ W4 e0 }: d

* D1 _: ?7 n$ U% {5 J; q6 W# r5 f- M" K% \
接着编译gdb,该程序运行在PC机上。- o8 i/ `& Q9 ^6 x7 e0 o5 U7 p

# B8 |& s4 t+ s4 p! L( V执行下列命令:( B( O$ F: q* X& p2 x5 D/ @

" J+ h2 _( W" n5 ]1 A: pyj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ cd ../../% x( `! ?1 Y( v9 W+ g5 F8 @
yj423@ubuntu:~/work_yj423/gdb-7.4$ sudo ./configure --targe=arm-unknown-linux-gnueabi, s" ^: S/ j, C5 y
yj423@ubuntu:~/work_yj423/gdb-7.4$ make
% \+ e6 l9 U8 E. G" f" n
( Q* y  z0 F) C: D请注意执行命令时所在的目录。执行完以后会在gdb-7.4/gdb/下生成可执行文件gdb。我将gdb改命为armgdb。& d! \/ S# m7 m& r% O) r
5 _: L2 ]7 }/ N' c
3. 使用gdb调试& `7 p6 u' x* _
测试程序为hello.c,程序如下:
. i& y5 A9 H; v. f7 f: x3 i- j. s; Y* V2 D! t4 @5 p, w! R
#include <stdio.h>
3 I, d3 |7 y" \! h0 D/ g
5 t/ F' g- j9 i6 z8 s- ]void main()9 j3 z: l& X- x) ]
{) Z% ?4 K5 H5 O; z5 {8 B
        printf("hello world\n");
$ H3 V( [' ?1 M/ ^- |        printf("hello world\n");6 e# z* H/ x# K# M: `5 b
}2 G0 {/ M( `+ I" s  B/ q( l
使用交叉编译器编译该文件,使用-g参数,生成hello。将gdbserver和hello复制到NFS的挂载点,我的挂载点为/home/yj423/nfswork。& w9 b1 K; W3 t+ {" r& V# Z1 U
yj423@ubuntu:~/nfswork$ ls* F1 P7 i+ M/ _, h  T+ N
bin   dev  gdbserver  home  linuxrc  proc  sbin  tmp  var
: s! N# l2 q6 `" oboot  etc  hello      lib   mnt      root  sys   usr  welcome) N9 F1 H: A6 J' M

: h9 o# @' ]! K. a可以看到gdbserver和hello。1 d4 S7 |2 p. Q
( u$ V/ g5 l1 z7 }) S
接着,在开发板上使用NFS:
+ o. ?% G6 k* X% v1 l5 y[root@yj423 /]#mount -o nolock 192.168.1.103:/home/yj423/nfswork /mnt/nfs/ p9 P% b7 n( {1 c; H5 W
[root@yj423 /]#cd /mnt/nfs& X6 |+ {; \# {2 Y
[root@yj423 nfs]#ls
( S8 b& @* q8 O; M/ w3 Fbin        dev        gdbserver  home       linuxrc    proc       sbin       tmp        var
4 V% p# a8 m! |' V, G5 d0 Yboot       etc        hello      lib        mnt        root       sys        usr        welcome3 m+ ~$ P' ?3 C' i# h5 [1 J
6 G5 e* D, T# I8 @4 y0 c+ B3 Y

$ j$ ]# D/ F9 n然后执行gdbserver:
$ P$ w/ q2 g) m  Z2 }$ o4 U2 e+ v& D5 I, v- ~# T
[root@yj423 nfs]#./gdbserver localhost:2001 hello! ~7 f7 S0 a0 b! }+ Q
Process hello created; pid = 948
8 w. ~( l7 k# A; Z# q' d, B" Z! hListening on port 2001. H6 x1 `% H( J0 d0 Z) r/ _' M
3 n$ X: R! K5 {8 d
2001为端口号,hello表示要调试的程序。此时gdbserver等待PC机进行链接。
* ~+ A2 `: b( z$ S* c- d; o& Q
# x, r$ L1 w% W* A- h- P5 S+ P# h$ F5 Z. Q* U. [
( O5 J7 S9 p' h( @/ U0 ~
在PC机上执行gdb:
3 c" Q  x" p/ T
( S8 |3 x( i+ S; J% c; H4 I- ]# b
+ @. |. t9 E* Q" R8 A- [8 Xyj423@ubuntu:~$ ./armgdb -q /home/yj423/nfswork/hello% w$ _! o2 T  U, r' Q" x* X
Reading symbols from /home/yj423/nfswork/hello...done.
- K; e+ o1 U# ?' S7 Q3 _3 W
  l1 C& h/ Q9 V0 K/ R5 _5 n执行远程链接:) e8 Q! i; u0 o" t: A4 S

+ O9 u0 f* g8 U3 g) g9 n(gdb) target remote 192.168.1.6:2001
/ w8 G5 B6 h4 o9 GRemote debugging using 192.168.1.6:2001" i3 M/ q2 R% D7 w! ?! [# ]$ |5 m" D
warning: Unable to find dynamic linker breakpoint function.
9 K; E' S) r! c* n/ \0 yGDB will be unable to debug shared library initializers7 ^/ m/ x! {/ q0 {5 ?
and track explicitly loaded dynamic code.
  V9 ?8 s1 x0 h+ I; O0x400007b0 in ?? ()
' G: S) j2 ~/ T! a: X' l  j(gdb)& F  c' ]+ z$ f
" [, z4 p% S& W
这里的192.168.1.6为开发板的IP地址。8 O" B6 _0 A+ e9 k( n

3 ]1 X7 g! S3 L5 T7 c至此PC端的gdb和开发板的gdbserver已经建立连接,接下来可以调试。; b  o: m" e! L( U; [
9 y( b: K( `1 X$ k& W( B
(gdb) b main0 H3 z* d( s! r0 z/ R/ P" ]- |
Cannot access memory at address 0x0# P) H2 S7 P6 f& V
Breakpoint 1 at 0x83e0: file hello.c, line 5.% f1 \. h+ t/ e3 A$ v4 V
(gdb) c1 R* g+ t" O! W: Z
Continuing.
% y8 e. d8 X+ o! M% e; g; ~warning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.
6 s" J8 S% X" b. W) Vwarning: Could not load shared library symbols for /lib/ld-linux.so.3.
1 T/ O- l4 K' HDo you need "set solib-search-path" or "set sysroot"?: @% X  G. {4 F' H/ c
Breakpoint 1, main () at hello.c:56 R. g0 T. R4 R, U1 W0 e2 ?# k2 v
5        printf("hello world\n");
: R, Y# T3 V5 h(gdb) n3 ?. |- G7 ^) U3 W4 T% M- t  n
6        printf("hello world\n");
6 i+ i. G% q9 @# g, \(gdb) n
5 ~4 N  W* `4 \7    }
' E( g: Z; q! L: }: ?) I  r0 l/ c, J2 o1 D
这里只是简单的调试。后面还会有共享库调试和多进程调试,尽请期待!$ z: r9 l4 {# }& r$ s) |6 `
6 R9 J! E2 l6 J$ p5 ?
/ Y( e0 f2 O- n) X
. c9 ^* c4 T$ k: T# \( G/ M

作者: SsaaM7    时间: 2020-6-16 18:31
使用GDB进行嵌入式远程调试




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2