|
|
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 |
|