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