嵌入式Linux (十)

姓名:杨乔   学号: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]

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容