Linux操作系统中GDB工具常见用法(一)_inferior 1(process 70400)exited normally(1)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

需要这份系统化的资料的朋友,可以点击这里获取!

编译上述代码,命令如下:

g++ -o gdb_test1 gdb_test1.cpp -g

**注意:**在编译过程中添加 -g 选项,将源代码信息添加到可执行文件中,便于后面进行 gdb 调试。

2.1.2 gdb调试
  1. 启动 gdb,命令及过程信息如下:
[root@node1 /opt/liitdar/mydemos/simples/gdb_test]# gdb
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-110.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) 

说明:

  • 启动 gdb 的命令格式为:“gdb”;
  • 启动 gdb 后,就可以在 gdb 命令行中输入 gdb 的调试命令了,后面介绍的 gdb 调试命令,都是在 gdb 命令行中输入并执行的。
  1. 加载被调试的可执行文件,命令及过程信息如下:
(gdb) file gdb_test1
Reading symbols from /opt/liitdar/mydemos/simples/gdb_test/gdb_test1...done.
(gdb) 

说明:

  • 加载被调试的可执行文件的命令格式为:“(gdb) file execute_file”,其中“可执行文件”信息可以使用绝对路径或相对路径。
  1. 设置断点(breakpoint),命令及过程信息如下:
(gdb) b main
Breakpoint 1 at 0x400923: file gdb_test1.cpp, line 17.
(gdb) 

说明:

  • 设置断点的命令格式为:“(gdb) b <行号>|<函数名称>|*<函数名称>|*<代码地址>”。在本例中,是通过“函数名称”设置断点的;
  • 断点编号从 1 开始递增;
  • 在设置完某一断点后,点击“Enter”键时,会在前一个断点对应的代码位置,继续执行断点设置操作,同时断点编号递增,命令及过程信息如下:
(gdb) b main
Breakpoint 1 at 0x400873: file gdb_test1.cpp, line 17.
(gdb) 
Note: breakpoint 1 also set at pc 0x400873.
Breakpoint 2 at 0x400873: file gdb_test1.cpp, line 17.
(gdb) 
Note: breakpoints 1 and 2 also set at pc 0x400873.
Breakpoint 3 at 0x400873: file gdb_test1.cpp, line 17.
(gdb) 
  • 在函数名称前面加“*”表示将断点设置在“由编译器生成的 prolog 代码处”。建议了解相关的汇编知识后,再使用此方法设置断点。
  1. 删除断点,命令及过程信息如下:
(gdb) d 1
(gdb) 

说明:

  • 删除断点的命令格式为:“(gdb) d [断点编号]”;
  • 如果指定了断点编号,此操作会删除该编号对应的断点;否则,会删除所有断点;
  • 执行删除断点命令后,再次添加断点时,断点编号会(在上一个断点编号基础上)递增,即删除的断点编号不会回收。

5. 运行被调试的可执行文件,命令及过程信息如下:

【未设置断点时】:

(gdb) r
Starting program: /opt/liitdar/mydemos/simples/gdb_test/gdb_test1 
Func main begin
Func Sum begin
Func Sum end
c is: 3
Func main end
[Inferior 1 (process 7432) exited normally]
(gdb) 

【设置断点时】:

(gdb) r
Starting program: /opt/liitdar/mydemos/simples/gdb_test/gdb_test1 

Breakpoint 2, main () at gdb_test1.cpp:17
17	    cout << "Func main begin" << endl;
(gdb) 

说明:

  • 运行被调试的可执行文件的命令格式为:“(gdb) r”;
  • 如果没有设置过断点,则执行完整程序;如果已经设置了断点,则程序运行到第一个可用的断点处暂停。在本例中,分别展示了设置断点和未设置断点的情况。

6. 继续执行被调试程序,命令及过程信息如下:

(gdb) c
Continuing.
Func main begin
Func Sum begin
Func Sum end
c is: 3
Func main end
[Inferior 1 (process 7548) exited normally]
(gdb) 

说明:

  • 继续执行被调试程序的命令格式为:“(gdb) c”;
  • 此操作会继续执行被调试程序,直至下一个断点或程序结束。在本例中,由于后面没有断点了,所以完整程序执行结束。

7. 执行一行调试程序源码(如有函数调用,则会进入该函数中,继续一次一行地执行该函数的代码),命令及过程信息如下:

(gdb) s
23	    c = Sum(a, b);
(gdb) 
Sum (x=@0x7fffffffe498: 1, y=@0x7fffffffe494: 2) at gdb_test1.cpp:7
7	    cout << "Func Sum begin" << endl;
(gdb) 

说明:

  • 执行一行调试程序源码(每次一行执行调用的函数语句)的命令格式为:“(gdb) s”;
  • 此操作用于执行一行源程序代码,如果此行代码中有函数调用,则会进入该函数中,继续一次一行地执行该函数的代码。在本例中,执行到 23 行时,由于该行存在函数调用语句“c = Sum(a, b);”,所以在执行该行代码时,程序流程进入了 Sum 函数中,后面每个“s”操作,都会继续执行 Sum 函数的每一行代码;
  • 此操作相当于其它调试器中的“Step Into (单步跟踪进入)”;
  • 此操作必须在调试程序包含源代码调试信息的情况下才可以使用(gcc 编译时使用“-g”参数)。

8. 执行一行调试程序源码(如有函数调用,会执行该函数的所有内容),命令及过程信息如下:

(gdb) n
23	    c = Sum(a, b);
(gdb) 
Func Sum begin
Func Sum end
24	    cout << "c is: " << c << endl;
(gdb) 

说明:

  • 执行一行调试程序源码(一次执行完成所有的调用的函数语句)的命令格式为:“(gdb) n”;
  • 此操作用于执行一行源程序代码,如果此行代码中有函数调用,则执行该函数的所有内容。在本例中,执行到 23 行时,由于该行存在函数调用语句“c = Sum(a, b);”,所以在执行该行代码时,函数 Sum 的全部内容都被执行了;
  • 此操作相当于其它调试器中的“Step Over (单步跟踪)”;
  • 此操作必须在调试程序包含源代码调试信息的情况下才可以使用(gcc 编译时使用“-g”参数);
  • 在执行 s 或 n 操作时,gdb 显示出来的代码是当前执行到的代码位置,而实际上该行代码尚未执行。例如,本例中第一个 n 操作后,gdb 中显示了“23     c = Sum(a, b);”内容,但此时该行(即 23 行)代码尚未执行(可通过打印 c 的值证实)。
  1. 打印变量的值,命令及过程信息如下:
(gdb) n
Func main begin
19	    int a = 1;
(gdb) 
20	    int b = 2;
(gdb) 
23	    c = Sum(a, b);
(gdb) p c
$19 = 0
(gdb) n
Func Sum begin
Func Sum end
24	    cout << "c is: " << c << endl;
(gdb) p c
$20 = 3
(gdb) 

说明:

  • 打印变量的值的命令格式为:“(gdb) p <变量名称>”;
  • 此操作用于打印指定变量(临时变量或全局变量)的值。在本例中,打印了变量 c 的值。

3 常见问题

3.1 Missing separate debuginfos

在运行 gdb 时,如果遇到此问题,说明系统中缺少 debug 信息,此问题的错误信息后面通常都会给出问题解决方法,如下:

Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7_4.2.x86_64 libgcc-4.8.5-16.el7_4.2.x86_64 libstdc++-4.8.5-16.el7_4.2.x86_64
  1. 根据提示的问题解决方法,运行相关的命令,操作如下:
[root@node1 /opt/liitdar/mydemos/simples/gdb_test]# debuginfo-install glibc-2.17-196.el7_4.2.x86_64 libgcc-4.8.5-16.el7_4.2.x86_64 libstdc++-4.8.5-16.el7_4.2.x86_64
Loaded plugins: fastestmirror
enabling epel-debuginfo
epel-debuginfo/x86_64/metalink                                                                                                                                                                                       | 7.0 kB  00:00:00     
epel-debuginfo                                                                                                                                                                                                       | 1.5 kB  00:00:00     
epel-debuginfo/x86_64/primary                                                                                                                                                                                        | 503 kB  00:00:02     
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * epel: mirror01.idc.hinet.net
 * epel-debuginfo: mirror01.idc.hinet.net
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
epel-debuginfo                                                                                                                                                                                                                    2783/2783
Could not find debuginfo for main pkg: glibc-2.17-196.el7_4.2.x86_64
Could not find debuginfo pkg for dependency package nss-softokn-freebl-3.28.3-8.el7_4.x86_64
Could not find debuginfo for main pkg: libgcc-4.8.5-16.el7_4.2.x86_64
Could not find debuginfo for main pkg: libstdc++-4.8.5-16.el7_4.2.x86_64
No debuginfo packages available to install


**先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前在阿里**

**深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**

**因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。**
![img](https://img-blog.csdnimg.cn/img_convert/f24c78acb12e3690d62b96546e8be3e0.png)
![img](https://img-blog.csdnimg.cn/img_convert/f2e98e1ceb31ec98203cd52391bb5d0d.png)
![img](https://img-blog.csdnimg.cn/img_convert/b75deea776e683dfbf3e762f089c6bb9.png)
![img](https://img-blog.csdnimg.cn/img_convert/5d94cb7de41dccfb70801eb14329a9ed.png)
![img](https://img-blog.csdnimg.cn/img_convert/6dabc70a757c74b5f76b9da61056d41a.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**

Mc-1715809666958)]
[外链图片转存中...(img-klxeY5WT-1715809666958)]
[外链图片转存中...(img-JWWSvNMa-1715809666959)]

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618635766)**

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值