找回密码
 注册
关于网站域名变更的通知
查看: 231|回复: 1
打印 上一主题 下一主题

使用GDB进行嵌入式远程调试

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-6-16 16:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
PC主机:Ubuntu 10.4
1 Q, d( k1 X( v" u5 f: t$ c4 I" J9 U" r6 L1 H; ?- W
目标板:TQ2440开发板,linux内核2.6.30
- I- y+ n" {2 J
$ V: E; W* w) a0 MNOTE:为了使用gdb进行调试,强烈建议使用nfs服务,否则调试会非常麻烦。
% @8 }* t2 ~9 R( z* m3 d
, u- v# A% F" d# ?8 E% T7 R! n使用nfs服务可以参考:S3C2440挂载NFS文件系统
7 \2 {. k  v( g: }' U9 H' a! p/ @5 Z- l7 S0 [. Z
1. 概述; h7 P, z  M+ w. X; r' F% B5 R
所谓远程调试,就是开发板上建立一个gdb服务端,同时待调试的程序也位于开发板,然后在PC机上使用gdb发起远程连接来进行调试。也就是说,在PC端调试开发板上的程序。请注意,在PC端需要包含被调试程序的符号调试信息(symbolic debug information),因此强烈建议使用NFS,否则需要两份被调试的应用程序,一份供gdb使用,另一份供gdbserver使用。
+ c9 Y1 S8 c4 s7 ]' E5 W
- B; [' c% x+ w- X0 |+ L2. 安装GDB服务+ w5 g* O9 C0 y: P
下载gdb安装包,下载地址:http://ftp.gnu.org/gnu/gdb/
; j! l, l: R1 u. c9 g
: P% M% \0 B# R$ k. k! Y. x7 s9 Y- M这里使用的是7.4。' r( E$ w& \: n- X

. T' i1 P! X8 z& d! Q: L解压安装包:
# h6 e+ }! C! ^( g) N) A( D5 K- W
$ j. m& J6 Z8 lyj423@ubuntu:~/work_yj423$ tar -xvf gdb-7.4/$ W+ p) D: t$ Q) }
8 D2 E3 k: o' E$ g1 Y) P  d
yj423@ubuntu:~/work_yj423/gdb-7.4$ pwd
  X, K( o) o% j: j$ I) B/home/yj423/work_yj423/gdb-7.41 C+ d! U' P3 d
3 B1 C7 o" j7 K. a6 A0 F- a. f
在开始编译之前,你必须知道你的交叉编译器的名字。我的交叉编译器是ARM-unknown-linux-gnueabi-gcc,在下面将会用到该名字。
' Z  [' x, `* x0 n; o
% l$ Z) i6 p' g9 q! {1 M8 R7 `% B& A* {% l
6 R6 [8 s  w7 |6 M& ^$ K# j
首先编译gdbserver,该程序运行在开发板上。# o8 N* P& v2 t" Y5 G  B( }; Z
+ H, G8 z' u6 O* u: z+ Z
执行下列命令:
1 v( T& L$ U' v+ }
( [* `$ \- G9 i3 Z. M& A6 e. l) ~yj423@ubuntu:~/work_yj423/gdb-7.4$ cd gdb/gdbserver/& s3 s9 O2 ]+ X6 H  O
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ ./configure --host=arm-unknown-linux-gnueabi --target=arm-unknown-linux-gnueab( @& G8 Y! h* H" P9 m# o' Z$ E
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ make
5 @7 l  w, M' C6 e* [* b: G$ B$ n, _
在make以后,会在当前目录下生成可执行文件gdbserver。" `0 B& I; x1 p& m/ f
" c/ k. W' z  y- S  D9 p
1 a% n! S2 i3 p, c6 V
' m4 w( A/ v: O! I1 e) \3 ?& g
接着编译gdb,该程序运行在PC机上。  I3 `8 ^' b$ v+ S/ u
: g5 w8 k7 {3 c+ u
执行下列命令:
( e2 U4 W( q! Y1 J7 c$ A2 u6 K* X. J8 E
yj423@ubuntu:~/work_yj423/gdb-7.4/gdb/gdbserver$ cd ../../  T. o5 M' ^% [1 x# |: g4 b
yj423@ubuntu:~/work_yj423/gdb-7.4$ sudo ./configure --targe=arm-unknown-linux-gnueabi+ G+ P0 w$ ~+ t, ]4 [% V: {
yj423@ubuntu:~/work_yj423/gdb-7.4$ make; W" b- n5 @  S( @% l5 l! D# V2 ?' R6 N+ I

- ?7 l9 h8 Y& P7 W* S( ?6 O2 d9 V请注意执行命令时所在的目录。执行完以后会在gdb-7.4/gdb/下生成可执行文件gdb。我将gdb改命为armgdb。) ^4 C* V. h5 \( @; t& h9 B1 v" K
4 H0 v, `- F, M+ x% \: p+ i
3. 使用gdb调试
* o2 E3 Y9 A2 W2 O" ^" ?测试程序为hello.c,程序如下:# m3 Y0 R) e0 w6 p

8 T! `% i' b/ U  Y( e#include <stdio.h>1 P$ I  M( N: c' B* z
5 Y( A% _1 N( U1 D2 y+ z$ ^8 ~: W6 G
void main()" o9 b" J" U) F5 R2 w+ S( |9 C
{
0 {  m' K  W3 [- q        printf("hello world\n");
: u. x8 N$ e7 G; B0 E        printf("hello world\n");7 I, I6 d& V6 s7 ~- Q8 O  S2 _
}
* t3 ~$ X# S/ P% B" O: n1 W0 c使用交叉编译器编译该文件,使用-g参数,生成hello。将gdbserver和hello复制到NFS的挂载点,我的挂载点为/home/yj423/nfswork。
2 i* W: k5 p" _# ayj423@ubuntu:~/nfswork$ ls
% H5 k; B) z8 a' @% d8 U9 ^bin   dev  gdbserver  home  linuxrc  proc  sbin  tmp  var
& X2 N) H: d: @+ D1 k2 Fboot  etc  hello      lib   mnt      root  sys   usr  welcome
2 V1 A! i1 [0 k8 g, F( Z) ~7 c" y3 }3 C  k# w  @% s( Z
可以看到gdbserver和hello。& F8 T+ ?- Q) C( e/ q

. B, }+ \- Y! Q9 ^0 Q% t接着,在开发板上使用NFS:. x7 }) k( C. @2 G! [6 f9 {" \
[root@yj423 /]#mount -o nolock 192.168.1.103:/home/yj423/nfswork /mnt/nfs% P% T. d. |( s* D2 Y# l
[root@yj423 /]#cd /mnt/nfs6 o5 S) U- c" l. [. y8 s; r5 l0 W
[root@yj423 nfs]#ls
* l! @* \; P6 @- K7 r# u; e4 rbin        dev        gdbserver  home       linuxrc    proc       sbin       tmp        var
' @6 _2 m1 H& }3 R/ bboot       etc        hello      lib        mnt        root       sys        usr        welcome
9 ]; q5 j3 Y7 x) E
: D' X. F9 o7 h  _# R6 d" j! a2 Y0 U
然后执行gdbserver:" A" g: f( ]# r2 D$ i7 d3 X

3 \' v3 g( Q( x; \' u[root@yj423 nfs]#./gdbserver localhost:2001 hello
. j  v, ]+ \8 l. U5 x  a7 SProcess hello created; pid = 948
! C) V" k8 c1 EListening on port 2001' p4 q% e4 A! k
1 q( u  g" j; X; g+ `
2001为端口号,hello表示要调试的程序。此时gdbserver等待PC机进行链接。9 C8 r6 ^, |0 [3 c" q! A' S! ?' c
2 o. p( d' v3 y; Z. b

2 Q- v/ m" K" X) K% N% L$ \: ~" Y* n- G
在PC机上执行gdb:5 b8 V9 q7 h0 S. W7 V
- N4 m! m9 E  L8 l7 k, L
1 `- b( C0 R, K% \4 J
yj423@ubuntu:~$ ./armgdb -q /home/yj423/nfswork/hello
( M- M: B$ ?) G3 |7 [Reading symbols from /home/yj423/nfswork/hello...done.9 g" q% U$ l* N' n7 J, ?8 {
+ u! l' y1 \% d: f+ l2 Z
执行远程链接:# Q1 \3 B; m. _& K/ M
! F, R' q* T7 B& q" S5 k' U+ A
(gdb) target remote 192.168.1.6:2001/ ]+ c) |8 [3 r3 v6 i& A
Remote debugging using 192.168.1.6:2001
1 v# P0 l: P0 T, a6 E" V* H6 n- wwarning: Unable to find dynamic linker breakpoint function.
$ P, i) W3 {5 jGDB will be unable to debug shared library initializers. l' W. B8 C0 m' h. k
and track explicitly loaded dynamic code.
  E: [6 M  ~, a6 j0x400007b0 in ?? ()' @/ M! k( E# N4 F- Z
(gdb)
7 A' g( u1 n5 a, p  `; G0 F. E* i! {, r- s: \
这里的192.168.1.6为开发板的IP地址。
! N$ ~- w- q, P: Y+ g8 v! l! O
; R+ Y, W! k! _5 d( g$ @至此PC端的gdb和开发板的gdbserver已经建立连接,接下来可以调试。
: \' V1 L5 P" U& }: p2 c% k* W+ E: `6 o7 R' n. t* B
(gdb) b main3 X1 [" A6 H) _% S: Y' A
Cannot access memory at address 0x04 X# y& V: x! D0 \, C; n
Breakpoint 1 at 0x83e0: file hello.c, line 5.% s. Q/ G9 a! E. f, a
(gdb) c, v9 F7 w  l+ t# k7 U* M: D, [* o
Continuing.
# J/ ^# o! e  d1 ?. h0 Dwarning: `/lib/libc.so.6': Shared library architecture unknown is not compatible with target architecture arm.
; X4 w4 V1 C/ x# swarning: Could not load shared library symbols for /lib/ld-linux.so.3.
0 I. L) m; Z( g7 N  A8 fDo you need "set solib-search-path" or "set sysroot"?
2 q: x4 h6 E* E4 l7 Y/ {- i+ f+ RBreakpoint 1, main () at hello.c:5+ w" i& m0 m8 F9 N" a
5        printf("hello world\n");
; @2 {# \4 L4 ~; Z; C(gdb) n
7 `2 p5 C4 L+ _4 s) [  ?* f( z6        printf("hello world\n");. `  H4 C7 {# n3 z* f$ n% ]5 \
(gdb) n' p0 @% k: r0 U0 V% f0 `, h% P
7    }
5 j& j  b0 \1 I
* U" k) L# J4 u, M2 e4 V这里只是简单的调试。后面还会有共享库调试和多进程调试,尽请期待!' W4 M; L. }* l
& \, Y! h) W* \7 F+ ]1 R- |* h6 u; U0 j

) y4 Z% [, p, D4 k# y4 |0 c' @* S! k

该用户从未签到

2#
发表于 2020-6-16 18:31 | 只看该作者
使用GDB进行嵌入式远程调试
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-26 04:36 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表