|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
PC主机:Ubuntu 10.4
( P3 A7 n2 e9 H7 ` b# l, o7 o4 N8 u; l& |8 O" _/ E
目标板:TQ2440开发板,linux内核2.6.30
0 ]( P/ B& r0 l8 x8 c% i8 G O/ P9 T' w* E
NOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦。6 }, c5 Z' v/ i! O9 T. ]: K) t4 C7 M
/ S9 h' U% G2 m& D7 m5 L2 ^3 @
使用nfs服务可以参考:S3C2440挂载NFS文件系统
: x0 i: `4 x+ i+ o
- S% {7 C( j/ J, ^1. 概述
# V; X2 P! s) r+ i7 r所谓远程调试,就是开发板上建立一个gdb服务端,同时待调试的程序也位于开发板,然后在PC机上使用gdb发起远程连接来进行调试。也就是说,在PC端调试开发板上的程序。请注意,在PC端需要包含被调试程序的符号调试信息(symbolic debug information),因此强烈建议使用NFS,否则需要两份被调试的应用程序,一份供gdb使用,另一份供gdbserver使用。 t3 @& B7 A1 V2 H3 h- c. G8 Z
0 h7 U; U2 U+ A- y) ?0 U4 E# R2. 安装GDB服务0 h: ]( w0 r& R+ v# i( w0 S) m: }
下载gdb安装包,下载地址:http://ftp.gnu.org/gnu/gdb/
9 i' @, S" {' G- I8 }) p" M
: Z' m& {' V4 t$ k: p9 M e m, J这里使用的是7.4。, F" ]) t( P `5 J6 [) H/ V: H
. `" B) Q# `3 Z2 U7 `" R; o解压安装包:
: x1 H+ i! N) C4 M; b
9 n1 j- R8 x0 I5 b$ t1 K! myj423@ubuntu:~/work_yj423$ tar -xvf gdb-7.4/2 n% {& h0 l+ U4 Y Q" R
% n0 Z6 W8 {6 w2 C+ hyj423@ubuntu:~/work_yj423/gdb-7.4$ pwd k1 X4 n9 Y$ p! i$ M1 y
/home/yj423/work_yj423/gdb-7.47 X. o4 I" Z6 ~7 B O8 c
' ~9 n! I7 F6 I D% n3 J, W
在开始编译之前,你必须知道你的交叉编译器的名字。我的交叉编译器是ARM-unknown-linux-gnueabi-gcc,在下面将会用到该名字。
! }- ^! S, U6 @( Y% M% z* i6 y4 r( u- f* L7 B
# B0 `( {. G$ ^7 p2 c% [1 O
+ V3 [/ o! o- m4 w* ]+ H" ]" I0 Q
首先编译gdbserver,该程序运行在开发板上。
- p1 \; R3 L6 v7 ]0 ] b
' F+ G/ b( y# Z! i0 V8 f9 u执行下列命令:
& I& L/ ^* _# ]2 a! `) B W
+ H; I. u4 n, Y9 W( e, D! Zyj423@ubuntu:~/work_yj423/gdb-7.4$ cd gdb/gdbserver/
( Q5 K# P2 J# S. l# Lyj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ ./configure --host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab" T8 A- g# K, L/ F: E
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ make
8 }- D$ j6 d7 [; B+ x- H8 t$ l- p% A" Y0 z1 ?
在make以后,会在当前目录下生成可执行文件gdbserver。2 `$ C9 f9 H2 [; i
0 f O% S1 t3 M/ k) l
5 F' u, i- w/ M8 D
! `2 m1 i6 z1 d0 g. g9 O接着编译gdb,该程序运行在PC机上。: d# m( B, w7 ~! _! t% v9 v1 D. g. P
" S1 {9 i0 c- U) ]4 F% T% g: }执行下列命令:1 k( k# J2 W- G& k/ D$ B; O, E
$ K0 }7 P! [; ~9 J s
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ cd ../../8 F! i, k1 @+ Z D- A
yj423@ubuntu:~/work_yj423/gdb-7.4$ sudo ./configure --targe=arm-unknown-linux-gnueabi6 O$ ~6 ^0 Q' I5 B6 Y
yj423@ubuntu:~/work_yj423/gdb-7.4$ make
" I% T2 |/ n; |3 C
. f; F- V& ?* _请注意执行命令时所在的目录。执行完以后会在gdb-7.4/gdb/下生成可执行文件gdb。我将gdb改命为armgdb。
* c3 x) Q0 {# b( c( l* j
) z; ^5 g) ]1 h' E# o3. 使用gdb调试8 O( f' ~3 ~: n
测试程序为hello.c,程序如下:) |# ~4 R+ E( W
3 a/ ]) H; I3 U
#include <stdio.h>, ~3 _+ G; W) `
1 ?0 F; H: p* p* K$ r
void main(), E) y; A" d! h/ @0 [
{& g/ R* E' f" _* o3 H
printf("hello world\n");
T7 `5 I u, Q6 f printf("hello world\n");
1 x" w. r% U( e1 X8 F# A: v}
1 o, n. ~( Z, r3 e3 M, ?* s使用交叉编译器编译该文件,使用-g参数,生成hello。将gdbserver和hello复制到NFS的挂载点,我的挂载点为/home/yj423/nfswork。' v, F$ w: \: K& ~5 j( Q U) ~
yj423@ubuntu:~/nfswork$ ls
$ I0 }' X# M/ I& e) C2 Z, C4 Jbin dev gdbserver home linuxrc proc sbin tmp var: |) l/ ~. K8 u! n2 ~% Y. K
boot etc hello lib mnt root sys usr welcome
/ Q5 J2 z8 L; ^0 f y$ s- r- w; E n9 M0 j2 X: e$ E
可以看到gdbserver和hello。3 j, U3 a* q; ?! q( D# m
* D" d) ]- o% I R. ^/ A$ o接着,在开发板上使用NFS:- h1 W# N" g' C
[root@yj423 /]#mount -o nolock 192.168.1.103:/home/yj423/nfswork /mnt/nfs
; \+ A2 i8 u+ B+ k/ t" ][root@yj423 /]#cd /mnt/nfs
5 N# [0 X; e7 k5 E4 b( Z- R[root@yj423 nfs]#ls
# o; X( D# s1 @3 d& h; C x/ Dbin dev gdbserver home linuxrc proc sbin tmp var0 I$ p) r4 e1 ~3 y/ T
boot etc hello lib mnt root sys usr welcome' y- ?" u) E, G6 S
% E. w# P* z7 G8 T' z) L
0 K' n; }$ M" q( ]7 N& ^ v/ k然后执行gdbserver:/ ^/ T! Y& I! f; a" o; q9 \
$ Z+ A5 C4 @( P L1 z& [[root@yj423 nfs]#./gdbserver localhost:2001 hello3 W* k. V4 ^7 V$ T. H) a8 r
Process hello created; pid = 9482 ?7 ^6 ^. ^8 C: v! e+ q- N& n
Listening on port 2001+ I" L' P; ~4 b! r* U+ _
: s% b S. d! U2001为端口号,hello表示要调试的程序。此时gdbserver等待PC机进行链接。
1 I7 F0 X8 i) y( {
" @( |& e4 p! v3 S; d
; q2 j% q; W* g( q# ]- \5 ?
4 k* r1 W" g% r8 l3 n在PC机上执行gdb:" t% \! b! p& M
6 e" y6 F% f3 ^- f
: R5 V( i0 V3 A/ @+ ^6 ]( B1 [yj423@ubuntu:~$ ./armgdb -q /home/yj423/nfswork/hello
* J' b' y9 u! }, ^7 c- r- z# R. D7 SReading symbols from /home/yj423/nfswork/hello...done.4 A* [7 ]1 B# M/ J! T) d7 e( u
6 o( Z$ T) g: _8 Y
执行远程链接:
: E r) E @! ]$ a4 }2 B3 x, Q) }1 |
(gdb) target remote 192.168.1.6:2001- `0 H v1 e+ ^9 N' V- N- ?, |
Remote debugging using 192.168.1.6:2001
% d7 s( g2 }8 D% Q9 |$ Iwarning: Unable to find dynamic linker breakpoint function.$ O+ k$ h7 d2 {8 m) ?7 f; H
GDB will be unable to debug shared library initializers
5 }0 ?2 p; y/ q( H# I9 }3 b4 }and track explicitly loaded dynamic code.) E% U7 P2 z- r- y/ n0 M
0x400007b0 in ?? ()0 o0 o+ V& O% n2 Y2 ~# X; x
(gdb)
y# t) H8 Y& f" J4 f
' z& R/ [4 i! L0 n. V这里的192.168.1.6为开发板的IP地址。5 `+ M1 E) a( ]0 ~4 _$ E
" z" M* N/ K7 l x* r3 t至此PC端的gdb和开发板的gdbserver已经建立连接,接下来可以调试。
& J, ]+ J K# Q$ p0 U1 ~. _1 {% Z/ B e
(gdb) b main
1 h* }, n# T4 e0 P; J7 h( @4 O( _Cannot access memory at address 0x0
- k4 d) ^! C7 n; zBreakpoint 1 at 0x83e0: file hello.c, line 5.
. u$ E- V0 t X0 U8 C) ^(gdb) c$ J7 C& Q- p6 a6 _" U' q, H5 j
Continuing.
+ M# n8 p: }. awarning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.: }- d. u3 L: P' o
warning: Could not load shared library symbols for /lib/ld-linux.so.3.
% @ S' u9 T# j/ LDo you need "set solib-search-path" or "set sysroot"?# d& T. m8 M* s! I% K
Breakpoint 1, main () at hello.c:5& }8 \: w3 _" `1 F0 \5 w- Q7 u0 g
5 printf("hello world\n");% c9 K* O) Z7 e& N/ v
(gdb) n
* j# R1 |: r2 |, c: a7 K3 a6 u2 x }6 printf("hello world\n");1 ^: U* i& `" d
(gdb) n
9 n! @, i, |' n* {( e4 G1 t7 }
' \1 L4 W: m1 k6 ~: \$ M: P
5 ]/ F; ^. ?6 x- Z2 J! N a这里只是简单的调试。后面还会有共享库调试和多进程调试,尽请期待!
" |0 z4 r9 N: U" c$ `/ {, h0 |2 @/ h" S3 J5 Y9 ^5 z- M1 _
! \+ U# |7 M, l @5 l7 S. O: `
2 n2 l( z) n5 |9 N |
|