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

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

[复制链接]

该用户从未签到

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

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

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-26 01:32 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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