姓名:杨乔 学号:19020100280 学院:电子工程学院
转自:
https://max.book118.com/html/2016/1207/69449578.shtm
【嵌牛导读】嵌入式一般指嵌入式系统。嵌入式系统由硬件和软件组成。是能够独立进行运作的器件。Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。
【嵌牛鼻子】嵌入式 Linux 调试器 GDB 的使用
【嵌牛提问】嵌入式 Linux 编译器 GDB 如何使用?
【嵌牛正文】
在程序编译通过生成可执行文件之后,就进入了程序的调试环节。调试一直是程序开发的重中之重,如何使程序员迅速找到错误的原因是一款调试器的首要目标。GDB是GNU开源组织发布的一个Linux下的程序调试工具,它是一种强大的命令行调试工具。一个出色的调试器需要有以下几项功能。①
能够运行程序,设置所有能影响程序运行的参数。② 能够让程序在指定的条件下停止运行。③ 能够在程序停止时检查所有参数的情况。④
能够根据指定条件改变程序的运行。
GDB 使用实例
下面是一个简单的实例,希望读者对GDB有一个感性的认识。这里所介绍的指令都是GDB中最为基本也是最为常用的指令,希望读者能够动手操作,掌握GDB的使用方法。
首先,有以下程序段。#include/*子函数add:将自然数从1~m相加*/int
add(int m)int i,n=0;for(i=1; i<=m;i++)n += i;printf("The sum of 1-%d
in add is %d\n", m,n);mianat main()int i,n=0;add(50);for(i=1; i<=50;
i++)n += i;printf("The sum of 1-50 is %d \n", n );
注意,将此程序用GCC进行编译时要加上“-g”选项。
1.进入GDB进入GDB只需输入GDB和要调试的可执行文件即可,如下所示。
[root@localhost
gdb]# gdb testGNU gdb Red Hat Linux (6.3.0.0-1.21rh)Copyright 2004 Free
Software Foundation, Inc.GDB is free software, covered by the GNU
General Public License, and you are welcome to change it and/or
distribute copies of it under certain conditions.Type "show copying" to
see the conditions.There is absolutely no warranty for GDB. Type "show
warranty" for details.This GDB was configured as
"i386-redhat-linux-gnu"...Using host libthread_db library
"/lib/libthread_db.so.1".(gdb)
可以看出,在GDB的启动画面中指出了GDB的版本号、使用的库文件等信息,接下来就进入由“(gdb)”开头的命令行界面了。
2.查看文件
在GDB中键入“l”(list)就可以查看所载入的文件,如下所示。
(gdb)
l4 {5 int i,n=0;6 for(i=1; i<=m;i++)7 n += i;8 printf("The
sum of 1-%d in add is %d\n", m,n);9 }1011 int
main()12 {3i31ntnn1ti1i3 int i,n=0;(gdb) l 14 add(50);15 for(i=1;
i<=50; i++)16 {17 n += i;18 }19 printf("The sum of 1-50 is %d
\n", n );2021 }
可以看出,GDB列出的源代码中明确地给出了对应的行号,这样可以大大地方便代码的定位。
在一般情况下,源代码中的行号与用户书写程序中的行号是一致的,但有时用户的某些编译选项会导致行号不一致的情况,因此,一定要查看在GDB中的行号。
3.设置断点
设置断点可以使程序执行到某个位置时暂时停止,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出问题的症结所在。在GDB中设置断点非常简单,只需在“b”后加入对应的行号即可(这是最常用的方法),其命令如下所示。
(gdb) b 6Breakpoint 1 at 0x804846d: file test.c, line 6.要注意的是,在 GDB 中利用行号设置断点是指代码运行到对应行之前暂停,如上例中,代码运行到第6行之前暂停(并没有运行第6行)。
4.查看断点处情况
在设置完断点之后,用户可以键入“info
b”来查看断点设置情况。在 GDB 中可以设置多个断点。(gdb) info bNum Type Disp Enb
Address What1 breakpoint keep y 0x0804846d in main at test.c:6
5.运行代码
接下来就可运行代码了,GDB默认从首行开始运行代码,可键入“r”(run)即可,在“r”后面加上行号即可从程序中指定行开始运行。(gdb)
rStarting program: /home/yul/book/testBreakpoint 1, add (m=50) at
test.c:6 6 for(i=1; i<=m;i++)可以看到,程序运行到断点处就停止了。
6.查看变量值
在程序停止运行之后,程序员可以查看断点处的相关变量值,在GDB中只需键入“p变量名”即可,如下所示。(gdb) p n$1 = 0(gdb) p i$2 = 134518440
在此处,为什么变量 i 的值是如此奇怪的一个数字呢?原因就在于程序是在断点设置的对应行之前停止的,此时代码没有把变量i的值赋为0,而只是一个随机的数字。但变量n是在程序第5行赋值的,所以此时n的值已经为0。
GDB在显示变量值时都会在对应值之前加上“$N”标记,它是当前变量值的引用标记,所以以后若想再次引用此变量就可以直接写作“$N”,而无需写冗长的变量名。
7.观察变量
在某一循环处,程序员往往希望能够观察一个变量的变化情况,这时就可以键入命令“watch”来观察变量的变化情况,如下所示。(gdb) watch nHardware watchpoint 2: n可以看到,GDB在“n”设置了观察点。
在此处必须键入完整的命令“watch”,因为在GDB中有不少以“w”开头的命令,如“where”、“while”等。
8.单步运行
单步运行是指一次只运行一条语句,这样可以方便程序员来查看程序运行的结果,在此处只需键入“n”(next)即可。(gdb)
n7 n += i;(gdb) nHardware watchpoint 2: nOld value = 15New value =
21 可以看到,随着程序的单步运行,当变量n的值发生变化时,GDB就会自动显示出n的变化情况。
9.程序继续运行
命令“c”(continue)可以使程序继续往下运行,直到再次遇到断点或程序结束,如下所示。(gdb)
cContinuing.The sum of 1-50 is 1275Program exited with code
031.10.退出GDB退出GDB只需使用指令“q”(quit)即可,如下所示。(gdb) q[root@localhost gcc]