|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PC主机:Ubuntu 10.4 # l( ?% J' {* w
" [4 W: o) v3 s3 l* b# A目标板:TQ2440开发板,linux内核2.6.30( r; k1 m8 t6 ~$ _( {
/ d9 ]& j! w/ M2 @( yNOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦。
$ ]* z1 ^* s5 Q/ x& C4 m' C4 A0 i2 I2 d; \) ]! v+ J
使用nfs服务可以参考:S3C2440挂载NFS文件系统
/ i9 i2 a" E5 _ a0 R% a! U/ L1 _$ d1 m7 _% { w
1. 概述7 G! [+ @2 e" d( y/ d; l& f* S
所谓远程调试,就是开发板上建立一个gdb服务端,同时待调试的程序也位于开发板,然后在PC机上使用gdb发起远程连接来进行调试。也就是说,在PC端调试开发板上的程序。请注意,在PC端需要包含被调试程序的符号调试信息(symbolic debug information),因此强烈建议使用NFS,否则需要两份被调试的应用程序,一份供gdb使用,另一份供gdbserver使用。
$ |6 o8 @1 n4 D* ^+ ^$ L* ?
. y% \ n4 t+ T0 w. S2. 安装GDB服务; d- K, k4 V d0 n5 }* z
下载gdb安装包,下载地址:http://ftp.gnu.org/gnu/gdb/
2 ~8 ]' w2 o7 s1 v% p: E* C* y
# |. C* ?2 _ v# B8 H1 }这里使用的是7.4。
0 s1 w7 `& j/ M! a# n( R8 t- W
. q9 Q8 ^: W5 s$ O, l& W解压安装包:5 r, G4 |& k" T+ r4 f
' l# y l- k6 O! ?yj423@ubuntu:~/work_yj423$ tar -xvf gdb-7.4/1 C+ N( I* q" ~
9 V4 p0 m0 [$ @. j( P8 M
yj423@ubuntu:~/work_yj423/gdb-7.4$ pwd! R& F( d: |& Q/ y! M/ O
/home/yj423/work_yj423/gdb-7.4! L3 @1 t$ S7 w d1 f0 w
3 V; D& a0 i. [& d在开始编译之前,你必须知道你的交叉编译器的名字。我的交叉编译器是ARM-unknown-linux-gnueabi-gcc,在下面将会用到该名字。
# b9 W/ s5 D! O: g; V! X
" |+ t/ m% _( z# p& c! q) g+ p
- t& |9 Q9 {3 d/ E6 ]; J& m) z4 H" R
首先编译gdbserver,该程序运行在开发板上。
' W- Z4 X' E* z# A
; t$ }5 X# B& x0 J( _ f' `6 L6 ?0 `执行下列命令:
4 U7 a% F) e: s: x) m
* J4 j9 O$ x1 E) e1 e8 Yyj423@ubuntu:~/work_yj423/gdb-7.4$ cd gdb/gdbserver/" m. |, t, O w6 v) o
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ ./configure --host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab. R; M/ J7 P0 c D! q2 c' E( R
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ make
; {# w4 ]& U; `+ j: x+ \
9 k/ A, _, u+ c2 u在make以后,会在当前目录下生成可执行文件gdbserver。
( x3 i% o% M. d& L0 G( ^$ L) r6 p' i9 J, H1 x! C$ M
/ h5 W+ R0 T. X3 v7 K* B8 i& r& g. F0 M/ F/ m# }. V3 ?
接着编译gdb,该程序运行在PC机上。, Q$ S J: z& T' q' P L, e
. A4 Y* z4 h3 a N执行下列命令:
8 W* d: \2 T$ v6 F& a2 g9 N# r: e
# v; S: m1 |2 A4 u- Xyj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ cd ../../. \, t: a/ a3 H9 ]6 H p
yj423@ubuntu:~/work_yj423/gdb-7.4$ sudo ./configure --targe=arm-unknown-linux-gnueabi
) T3 c' }& N4 \* Q- O. Dyj423@ubuntu:~/work_yj423/gdb-7.4$ make
( S0 y1 P, {$ S+ ?. y; l
% w/ S; f, b9 x( `请注意执行命令时所在的目录。执行完以后会在gdb-7.4/gdb/下生成可执行文件gdb。我将gdb改命为armgdb。0 T/ Y/ y$ v0 b* v0 I
% D. J' t; \" I
3. 使用gdb调试% K- i( F( ^2 l9 P1 {+ ^3 T5 W
测试程序为hello.c,程序如下:
4 ^' m' Q9 v8 |* w# e" ?( @6 f. k/ y
% V) i f! F" u% a6 X#include <stdio.h>
! ^# T$ m+ D4 p3 Y. o8 T5 v* I3 @% H. ^ D* j& h* P
void main(): Q2 G. v+ c/ K9 K# J
{! s3 O/ ?3 g) U% r& a
printf("hello world\n"); M s3 V' p( u
printf("hello world\n");
5 v% ?- ~" R1 \& I6 A. H# T* \! w}
7 b1 n* ]! {3 V" O2 u, A使用交叉编译器编译该文件,使用-g参数,生成hello。将gdbserver和hello复制到NFS的挂载点,我的挂载点为/home/yj423/nfswork。7 k$ A, G2 q8 ~
yj423@ubuntu:~/nfswork$ ls; ^+ c7 {. o" ~* H/ m
bin dev gdbserver home linuxrc proc sbin tmp var
' K3 J: N$ ~$ `. K( n4 w) X: eboot etc hello lib mnt root sys usr welcome' W; V( w* r$ K/ W2 I# c+ d4 P
7 p5 [$ t1 M" l) @4 D可以看到gdbserver和hello。+ S, v7 x$ B' h8 l$ ?8 h
* z! F8 U3 `$ n7 t y接着,在开发板上使用NFS:0 v" {; W1 M$ D
[root@yj423 /]#mount -o nolock 192.168.1.103:/home/yj423/nfswork /mnt/nfs
' g" d1 G+ n2 g1 [" A+ s[root@yj423 /]#cd /mnt/nfs
( M0 O6 Y; e9 U- h[root@yj423 nfs]#ls
( U3 ]8 Z2 G* ~! @bin dev gdbserver home linuxrc proc sbin tmp var
0 C" g+ K1 B' i1 I2 \7 _3 Q- ?boot etc hello lib mnt root sys usr welcome& _' @1 @& f4 R9 c, D+ O- h
0 c& q- _0 B3 l$ f R, p
3 M* L* Q+ ?& Y' o& M' j) i; Q然后执行gdbserver:; h$ i& o0 y# V3 g% C) z# @
5 I: @' Y8 Q+ O
[root@yj423 nfs]#./gdbserver localhost:2001 hello; |0 D$ ]% C1 N0 U n& [
Process hello created; pid = 948 n m3 K2 S" G2 M; j3 E: K
Listening on port 2001
6 S( Y- P/ Y+ W, \- x3 E8 o+ l- V. T* e* t; f( ?: l
2001为端口号,hello表示要调试的程序。此时gdbserver等待PC机进行链接。
7 i( ~( I9 v N
4 v6 Z B ^8 n" ~7 m/ V; }1 `
6 E* j6 l/ l( h6 L8 o7 r; |- Q7 F [" Q8 r
在PC机上执行gdb:
, x1 C7 @ u5 K: f% d' U; k, ~4 D
9 `# Z, F& H' K M$ a2 [ a" R8 W# B) y+ R5 M# {4 i
yj423@ubuntu:~$ ./armgdb -q /home/yj423/nfswork/hello
% A9 u3 T; c. y/ s# }) n% H0 m0 wReading symbols from /home/yj423/nfswork/hello...done.
7 [8 L) X* j% J% w5 v0 E
6 O x7 n) h% k. l, F执行远程链接:
5 L; M6 G# K! x& _0 {. @2 Z- [) H: i1 W( j0 d& N( L0 g
(gdb) target remote 192.168.1.6:2001, Q* M8 y, P0 I" N+ _( Q
Remote debugging using 192.168.1.6:2001
2 X& F4 |. W+ ^1 k( t" A' Nwarning: Unable to find dynamic linker breakpoint function.4 V* i% q8 w Q: ^ e4 K
GDB will be unable to debug shared library initializers( s, t8 m- _6 I1 Q F3 M' n
and track explicitly loaded dynamic code.) X) r7 `7 [2 _
0x400007b0 in ?? ()
; f* D& h* c; U# `(gdb)8 |% r& D) h! t" l2 ]
+ p; h7 K$ k9 Y& r这里的192.168.1.6为开发板的IP地址。
0 x0 w7 {3 S/ r! a: B/ G: R; b( e* j3 @# N
至此PC端的gdb和开发板的gdbserver已经建立连接,接下来可以调试。
6 k! I7 h* l- a# s
/ @8 ?) @( z% \1 v(gdb) b main
% k! V: ~0 e {. O; J3 k! VCannot access memory at address 0x0
$ o, ^) r- f6 ?* g& |; SBreakpoint 1 at 0x83e0: file hello.c, line 5.& @+ B" X" u0 _; O
(gdb) c
$ D5 w% n; B/ _& \" s9 HContinuing.
$ h* c3 E% i1 wwarning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.5 e( |" c" S! b1 R9 ^. v; u$ }% Q
warning: Could not load shared library symbols for /lib/ld-linux.so.3.7 |: F" r; H1 ^- B4 s. N$ |# v. t
Do you need "set solib-search-path" or "set sysroot"?
# {, v' u+ ~0 p$ b6 _4 J+ UBreakpoint 1, main () at hello.c:5) Q6 Y% k R$ h, c! D
5 printf("hello world\n");
/ x% k, ?1 h0 N(gdb) n `) P! c( w' S6 q5 q
6 printf("hello world\n");, b: J; X' L% c$ Z
(gdb) n
( V3 J8 [* m2 D5 s, p7 }6 }5 d' `2 n h% A5 o. Z
6 a8 a* g& q8 k这里只是简单的调试。后面还会有共享库调试和多进程调试,尽请期待!# w) L8 C+ Y" Y8 F) D: X% i
~( H+ U5 {- S( J+ E ^% O. ?* I
4 K& M2 g. ~6 r6 x; l
/ |7 A- E3 W' T p/ ~
|
|