EDA365电子论坛网
标题:
使用GDB进行嵌入式远程调试
[打印本页]
作者:
pulbieup
时间:
2020-6-16 16:49
标题:
使用GDB进行嵌入式远程调试
PC主机:Ubuntu 10.4
# v' F- ^* Q& Y+ m" `2 `1 i
+ A+ L- C: X2 M" P2 k4 p% e/ I
目标板:TQ2440开发板,linux内核2.6.30
: e! n1 n7 r. l" |% W7 V
/ e |1 c+ z% \! C+ ?. E
NOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦。
, R0 g) a3 p- ^
: X* n1 h, a7 T7 N3 _- Y9 O* U1 q" `
使用nfs服务可以参考:S3C2440挂载NFS文件系统
) U N1 }0 V) Z5 D3 o4 O5 b
; z2 n: T! n7 E2 d9 H) O
1. 概述
$ n1 Y, V1 n) K4 X" K, R u) H; ?
所谓远程调试,就是开发板上建立一个gdb服务端,同时待调试的程序也位于开发板,然后在PC机上使用gdb发起远程连接来进行调试。也就是说,在PC端调试开发板上的程序。请注意,在PC端需要包含被调试程序的符号调试信息(symbolic debug information),因此强烈建议使用NFS,否则需要两份被调试的应用程序,一份供gdb使用,另一份供gdbserver使用。
9 L( r" h P0 N7 d
0 P# K. D7 e9 m7 g
2. 安装GDB服务
& M* x) N6 x/ D% ^* u* V
下载gdb安装包,下载地址:
http://ftp.gnu.org/gnu/gdb/
. i' X7 K7 n5 c8 A5 {, H
5 S" ?8 n# Y6 X/ N
这里使用的是7.4。
+ y" Z6 C5 b8 F4 l2 ^* Z
( n9 Q/ c4 w* F. N# v+ v& U
解压安装包:
3 H3 b$ A' h" D: m
: S" w+ l- W) e' j: w$ \$ a' C) c
yj423@ubuntu:~/work_yj423$ tar -xvf gdb-7.4/
0 G) v" w0 k) ~4 m% y+ \, l
! X4 ?1 D c: i
yj423@ubuntu:~/work_yj423/gdb-7.4$ pwd
3 B; Z4 D: m! H, u
/home/yj423/work_yj423/gdb-7.4
0 Y2 ^' |- C+ Z
: [1 i( H3 a( X2 t0 q
在开始编译之前,你必须知道你的交叉编译器的名字。我的交叉编译器是arm-unknown-linux-gnueabi-gcc,在下面将会用到该名字。
2 G3 M7 E# s' |: H1 T$ r
$ d) }9 _ u3 v: k) T8 O
4 y2 h" v/ V7 s1 s# u
7 f2 w7 y& \+ p, s9 o
首先编译gdbserver,该程序运行在开发板上。
4 }. [+ R2 [9 F" c# G
$ u9 C* b1 F, Q7 N Y! M
执行下列命令:
, |2 u; b. M j( I+ b
4 x4 }9 Z/ z7 r2 i7 c6 H
yj423@ubuntu:~/work_yj423/gdb-7.4$ cd gdb/gdbserver/
9 O9 d* @5 b- D: ?7 [* U
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ ./configure --host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab
* K3 q+ I# | L' r
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ make
, S7 Y0 k0 L/ N2 e$ [
4 B7 H4 |$ C$ Z$ q9 \5 E+ e) V
在make以后,会在当前目录下生成可执行文件gdbserver。
% @" i6 D7 }* K
/ b$ o& \$ W4 e0 }: d
* D1 _: ?7 n$ U% {
5 J; q6 W# r5 f- M" K% \
接着编译gdb,该程序运行在PC机上。
- o8 i/ `& Q9 ^6 x7 e0 o5 U7 p
# B8 |& s4 t+ s4 p! L( V
执行下列命令:
( B( O$ F: q* X& p2 x5 D/ @
" J+ h2 _( W" n5 ]1 A: p
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ cd ../../
% x( `! ?1 Y( v9 W+ g5 F8 @
yj423@ubuntu:~/work_yj423/gdb-7.4$ sudo ./configure --targe=arm-unknown-linux-gnueabi
, s" ^: S/ j, C5 y
yj423@ubuntu:~/work_yj423/gdb-7.4$ make
% \+ e6 l9 U8 E. G" f" n
( Q* y z0 F) C: D
请注意执行命令时所在的目录。执行完以后会在gdb-7.4/gdb/下生成可执行文件gdb。我将gdb改命为armgdb。
& d! \/ S# m7 m& r% O) r
5 _: L2 ]7 }/ N' c
3. 使用gdb调试
& `7 p6 u' x* _
测试程序为hello.c,程序如下:
. i& y5 A9 H; v. f7 f: x3 i- j
. s; Y* V2 D! t4 @5 p, w! R
#include <stdio.h>
3 I, d3 |7 y" \! h0 D/ g
5 t/ F' g- j9 i6 z8 s- ]
void main()
9 j3 z: l& X- x) ]
{
) Z% ?4 K5 H5 O; z5 {8 B
printf("hello world\n");
$ H3 V( [' ?1 M/ ^- |
printf("hello world\n");
6 e# z* H/ x# K# M: `5 b
}
2 G0 {/ M( `+ I" s B/ q( l
使用交叉编译器编译该文件,使用-g参数,生成hello。将gdbserver和hello复制到NFS的挂载点,我的挂载点为/home/yj423/nfswork。
& w9 b1 K; W3 t+ {" r& V# Z1 U
yj423@ubuntu:~/nfswork$ ls
* F1 P7 i+ M/ _, h T+ N
bin dev gdbserver home linuxrc proc sbin tmp var
: s! N# l2 q6 `" o
boot etc hello lib mnt root sys usr welcome
) N9 F1 H: A6 J' M
: h9 o# @' ]! K. a
可以看到gdbserver和hello。
1 d4 S7 |2 p. Q
( u$ V/ g5 l1 z7 }) S
接着,在开发板上使用NFS:
+ o. ?% G6 k* X% v1 l5 y
[root@yj423 /]#mount -o nolock 192.168.1.103:/home/yj423/nfswork /mnt/nfs
/ p9 P% b7 n( {1 c; H5 W
[root@yj423 /]#cd /mnt/nfs
& X6 |+ {; \# {2 Y
[root@yj423 nfs]#ls
( S8 b& @* q8 O; M/ w3 F
bin dev gdbserver home linuxrc proc sbin tmp var
4 V% p# a8 m! |' V, G5 d0 Y
boot etc hello lib mnt root sys usr welcome
3 m+ ~$ P' ?3 C' i# h5 [1 J
6 G5 e* D, T# I8 @4 y0 c+ B3 Y
$ j$ ]# D/ F9 n
然后执行gdbserver:
$ P$ w/ q2 g) m Z
2 }$ o4 U2 e+ v& D5 I, v- ~# T
[root@yj423 nfs]#./gdbserver localhost:2001 hello
! ~7 f7 S0 a0 b! }+ Q
Process hello created; pid = 948
8 w. ~( l7 k# A; Z# q' d, B" Z! h
Listening on port 2001
. H6 x1 `% H( J0 d0 Z) r/ _' M
3 n$ X: R! K5 {8 d
2001为端口号,hello表示要调试的程序。此时gdbserver等待PC机进行链接。
* ~+ A2 `: b( z$ S* c- d; o& Q
# x, r$ L1 w% W* A- h- P
5 S+ P# h$ F5 Z. Q* U. [
( O5 J7 S9 p' h( @/ U0 ~
在PC机上执行gdb:
3 c" Q x" p/ T
( S8 |3 x( i+ S; J% c; H4 I- ]# b
+ @. |. t9 E* Q" R8 A- [8 X
yj423@ubuntu:~$ ./armgdb -q /home/yj423/nfswork/hello
% w$ _! o2 T U, r' Q" x* X
Reading symbols from /home/yj423/nfswork/hello...done.
- K; e+ o1 U# ?' S7 Q3 _3 W
l1 C& h/ Q9 V0 K/ R5 _5 n
执行远程链接:
) e8 Q! i; u0 o" t: A4 S
+ O9 u0 f* g8 U3 g) g9 n
(gdb) target remote 192.168.1.6:2001
/ w8 G5 B6 h4 o9 G
Remote debugging using 192.168.1.6:2001
" i3 M/ q2 R% D7 w! ?! [# ]$ |5 m" D
warning: Unable to find dynamic linker breakpoint function.
9 K; E' S) r! c* n/ \0 y
GDB will be unable to debug shared library initializers
7 ^/ m/ x! {/ q0 {5 ?
and track explicitly loaded dynamic code.
V9 ?8 s1 x0 h+ I; O
0x400007b0 in ?? ()
' G: S) j2 ~/ T! a: X' l j
(gdb)
& F c' ]+ z$ f
" [, z4 p% S& W
这里的192.168.1.6为开发板的IP地址。
8 O" B6 _0 A+ e9 k( n
3 ]1 X7 g! S3 L5 T7 c
至此PC端的gdb和开发板的gdbserver已经建立连接,接下来可以调试。
; b o: m" e! L( U; [
9 y( b: K( `1 X$ k& W( B
(gdb) b main
0 H3 z* d( s! r0 z/ R/ P" ]- |
Cannot access memory at address 0x0
# P) H2 S7 P6 f& V
Breakpoint 1 at 0x83e0: file hello.c, line 5.
% f1 \. h+ t/ e3 A$ v4 V
(gdb) c
1 R* g+ t" O! W: Z
Continuing.
% y8 e. d8 X+ o! M% e; g; ~
warning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.
6 s" J8 S% X" b. W) V
warning: Could not load shared library symbols for /lib/ld-linux.so.3.
1 T/ O- l4 K' H
Do you need "set solib-search-path" or "set sysroot"?
: @% X G. {4 F' H/ c
Breakpoint 1, main () at hello.c:5
6 R. g0 T. R4 R, U1 W0 e2 ?# k2 v
5 printf("hello world\n");
: R, Y# T3 V5 h
(gdb) n
3 ?. |- G7 ^) U3 W4 T% M- t n
6 printf("hello world\n");
6 i+ i. G% q9 @# g, \
(gdb) n
5 ~4 N W* `4 \
7 }
' E( g: Z; q! L: }: ?) I
r0 l/ c, J2 o1 D
这里只是简单的调试。后面还会有共享库调试和多进程调试,尽请期待!
$ z: r9 l4 {# }& r$ s) |6 `
6 R9 J! E2 l6 J$ p5 ?
/ Y( e0 f2 O- n) X
. c9 ^* c4 T$ k: T# \( G/ M
作者:
SsaaM7
时间:
2020-6-16 18:31
使用GDB进行嵌入式远程调试
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2