|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PC主机:Ubuntu 10.4 ; Z2 i l7 [. Y; }( _! [
$ r5 | Z8 }$ x0 A# w+ g: p
目标板:TQ2440开发板,linux内核2.6.302 P. K5 o0 p8 C$ E' T$ F
+ g1 `9 R' P6 ^$ l2 @. B0 S Y& v! ]' d% }NOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦。
8 D# s, J$ g5 r3 H0 Y/ G
3 m6 K/ P2 V- Y7 g$ W- h! a使用nfs服务可以参考:S3C2440挂载NFS文件系统
. U# w7 }$ u! i! Y( A' ]# B7 e* b1 k" A/ ^2 G4 G, I. _
1. 概述* ^8 S* A9 j, G* V- _5 b
所谓远程调试,就是开发板上建立一个gdb服务端,同时待调试的程序也位于开发板,然后在PC机上使用gdb发起远程连接来进行调试。也就是说,在PC端调试开发板上的程序。请注意,在PC端需要包含被调试程序的符号调试信息(symbolic debug information),因此强烈建议使用NFS,否则需要两份被调试的应用程序,一份供gdb使用,另一份供gdbserver使用。
1 ] T0 E5 y0 ?' \8 I& R. w/ a z9 q8 i( j* J6 \! [
2. 安装GDB服务 Z; C" G3 J2 p' J" O7 R4 z. H
下载gdb安装包,下载地址:http://ftp.gnu.org/gnu/gdb/
~' K- f1 f1 q# o3 L
3 l" ]0 |. c2 C7 s$ G这里使用的是7.4。# ~- W* j! B& n$ e4 e, x
: K: R4 [8 d9 h' F! G0 y2 N解压安装包:
$ D2 i3 c& A, u2 J' D6 n! P( F
, e( R& }* w; C& N: Cyj423@ubuntu:~/work_yj423$ tar -xvf gdb-7.4/
: o: R3 X% l4 H& o1 m) \3 {
$ g% L: ]# F0 w) X u7 [0 dyj423@ubuntu:~/work_yj423/gdb-7.4$ pwd
+ J" _; x u6 B( P' q7 w/home/yj423/work_yj423/gdb-7.4
9 T" g1 l( o/ Y3 i( F- f# Q( i. W& Q& h, Z$ p
在开始编译之前,你必须知道你的交叉编译器的名字。我的交叉编译器是ARM-unknown-linux-gnueabi-gcc,在下面将会用到该名字。# R8 P. F/ k; x1 D; a3 I8 u
+ C7 V; u) b; F( K1 W6 ~- w& V, W* ^3 P6 K' ^
7 U. ]$ x. m$ _; F. A! {
首先编译gdbserver,该程序运行在开发板上。1 L# P3 k `1 z+ G
4 `7 c8 S( H2 N, |执行下列命令:, A1 `/ P; O) Y: C4 z/ @7 R
+ V/ `$ h n; }2 K
yj423@ubuntu:~/work_yj423/gdb-7.4$ cd gdb/gdbserver/
3 V7 F& ^6 o0 s& z' `% j9 syj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ ./configure --host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab
1 I4 x+ G1 H2 M% W! P% L9 oyj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ make( c1 @4 J! c3 @2 h4 X. l8 M
0 N4 S, o' i* a: f: [; l8 `在make以后,会在当前目录下生成可执行文件gdbserver。/ B" ?1 k4 G( u/ K2 m; F
7 }0 v0 e* k* `- [4 b
4 U# G7 p6 y! w
: r0 b) i' i+ H# v+ r0 W, y接着编译gdb,该程序运行在PC机上。
0 c: _1 ?- ]* Q, t) w- |: E3 s. d t0 M3 U& |
执行下列命令:
) k5 l1 m5 V2 b2 b8 a4 }8 J
7 K$ a: x2 K0 O7 E9 H3 Kyj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ cd ../../
% y9 H9 y$ T0 Q, W+ C9 V# y3 T3 l/ S1 Z3 Myj423@ubuntu:~/work_yj423/gdb-7.4$ sudo ./configure --targe=arm-unknown-linux-gnueabi
1 y- ^! H! ^# v" K: \yj423@ubuntu:~/work_yj423/gdb-7.4$ make
8 y9 L# _3 W& b2 f+ f' {, u# O* q. [6 T; |' ] Q8 G
请注意执行命令时所在的目录。执行完以后会在gdb-7.4/gdb/下生成可执行文件gdb。我将gdb改命为armgdb。
) a% N, }& ?$ z2 ^9 a+ k- ?1 e9 n; B5 B
3. 使用gdb调试3 u% F4 V. ^' U, x6 Q' ]5 ^& }
测试程序为hello.c,程序如下:
; N6 ^. |7 F/ B( J
# T( b+ n9 J( d* T i) V#include <stdio.h>6 b# A/ Q; y: |5 G7 D4 O, g. Y: l' R2 {
8 g5 @+ q4 e$ R- \4 Cvoid main()
/ |) H7 r1 `9 A- I{4 s& k3 d: t& O! E0 g g
printf("hello world\n"); h* D& F+ Z$ w) e+ A- F
printf("hello world\n");
7 ~0 V1 k- H( Y$ S}. \0 V, s- W) F7 e) a2 I4 ~/ I/ @
使用交叉编译器编译该文件,使用-g参数,生成hello。将gdbserver和hello复制到NFS的挂载点,我的挂载点为/home/yj423/nfswork。
- c; {! l: d% |8 ]; D8 t% V0 [yj423@ubuntu:~/nfswork$ ls1 ?+ Y$ ~: f4 w
bin dev gdbserver home linuxrc proc sbin tmp var7 C9 @1 }6 E/ @+ _" W
boot etc hello lib mnt root sys usr welcome
6 r0 P2 o; L' L# V9 j6 s* c9 c& V( y7 `% g- ~7 `, |; b- w
可以看到gdbserver和hello。
- L9 c* Z- ^/ N8 S, i2 |3 j1 ]9 ?( `
1 R: }8 g9 I: f# B接着,在开发板上使用NFS:
6 a. _+ d! f% I; Z1 n[root@yj423 /]#mount -o nolock 192.168.1.103:/home/yj423/nfswork /mnt/nfs
3 V; c* k4 f; X" Q! ]& u2 ][root@yj423 /]#cd /mnt/nfs
) D' ~$ ]) I4 } g$ D3 s/ T2 {[root@yj423 nfs]#ls. S2 E! ?' `0 n, d" V5 V0 L5 T5 p
bin dev gdbserver home linuxrc proc sbin tmp var9 Q. Z# T" H6 S/ I) O b
boot etc hello lib mnt root sys usr welcome
' r7 A; u$ N: n: ~& R/ P7 }+ R, k& k5 ~
2 O. [5 o# T3 H) h
然后执行gdbserver:
$ o8 P% }4 j9 ^
0 v: |1 w- q1 H- A- h[root@yj423 nfs]#./gdbserver localhost:2001 hello6 Q- H7 d& k( s+ X
Process hello created; pid = 9482 M. H3 R/ k) Z' r& w7 o4 R
Listening on port 2001& {1 ]" j0 x& m; T3 W1 b
6 l! @. ]' n& w+ C& `8 H3 }8 T% f2001为端口号,hello表示要调试的程序。此时gdbserver等待PC机进行链接。
X3 I1 c, S& o5 ^ p. j" U
! ?( d7 A0 W7 c+ K) J2 i9 ^3 S/ {" W3 S7 X, M
% V. I% g) |0 V在PC机上执行gdb:. N, \: ~1 _) ]4 q; U0 O2 w
3 Q4 z+ A" R/ b7 D+ Y' P0 ~$ L
# w- R. G8 V- \8 L
yj423@ubuntu:~$ ./armgdb -q /home/yj423/nfswork/hello
Y+ j4 g2 C4 L( TReading symbols from /home/yj423/nfswork/hello...done.
3 Q" ^& i5 {7 }5 ?) T! x
( F: Y" k( y' G. w |0 q6 n% t执行远程链接:
4 d* T" z/ X E' B
. T# `! H7 h. r% e& { W+ L(gdb) target remote 192.168.1.6:2001
$ _, h) ^2 I& _# LRemote debugging using 192.168.1.6:2001
4 R7 |1 `# Z) V' }warning: Unable to find dynamic linker breakpoint function.
. W/ V8 T. t0 g+ _! M+ `GDB will be unable to debug shared library initializers
8 M5 }" e7 x0 g0 B* e- M' y) Tand track explicitly loaded dynamic code.
( p* W$ U/ o, j& g: t% ^0x400007b0 in ?? ()* ~# g: @8 M' c" r e0 @& \# Y
(gdb)
; `+ l5 k5 i& T# D# Q; D f, i
这里的192.168.1.6为开发板的IP地址。. S1 U% N" G8 e: c" A1 L
: P1 W* T; B' e- ?5 z
至此PC端的gdb和开发板的gdbserver已经建立连接,接下来可以调试。
% J g3 Z9 X( L" O) G. Q( v; x9 p7 Q' Y- t7 m" Q, ?# Q+ S5 N0 a9 D
(gdb) b main
y ]) {& D# M0 h7 a- d0 VCannot access memory at address 0x0
/ {7 v1 ~1 H2 w- ^- B$ h$ HBreakpoint 1 at 0x83e0: file hello.c, line 5.. F5 }) S1 T3 ]% M
(gdb) c9 Q" H* S# b$ N, ^+ F S
Continuing.7 a1 U) D9 q# [9 g# H& S
warning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.5 [9 I3 l: @+ y9 N1 a
warning: Could not load shared library symbols for /lib/ld-linux.so.3. V5 L# q( _/ A
Do you need "set solib-search-path" or "set sysroot"?: Y% m+ ` ]: r
Breakpoint 1, main () at hello.c:5
" F& U- i; [9 G+ i, i5 printf("hello world\n");
5 L$ Z+ B# i2 C& C9 l, Q" w6 O(gdb) n
/ e: \3 s: N4 B2 |* P% r6 printf("hello world\n");
8 d7 P/ U1 _! V; O(gdb) n
4 i* u8 C- e2 ]; I" d7 }& Z X& r- T4 c9 u( X
; k1 j/ [7 \! o3 F5 _; `# t! R5 ?
这里只是简单的调试。后面还会有共享库调试和多进程调试,尽请期待!
) Z: Y) K9 h. N; v1 L. B
" }7 Z# {. n: z% \( Y- d8 R1 y5 O5 \
& h7 H. @1 ]: P- C5 P
|
|