嵌入式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]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容