一文入门Linux下gdb调试(一)

简介: 一文入门Linux下gdb调试(一)


转载授权以及围观:欢迎添加微信号:Conscience_Remains

总述

   在window下我们习惯了IDE的各种调试按钮,说实话确实挺方便的,但到了Linux下,没有那么多的IDE支持我们调试,但是Linux有也有强大的命令行C/C++的调试工具——GDB,GNU提供的开源调试工具。

   刚开始不习惯,使用多了我们就会喜欢上他,程序调试的单步执行,跳入函数,跳出函数,设置断点,设置观察点,查看变量。GDB都有,此外gdb还可以生成程序非法执行后core dump文件,这个文件有快照功能,在程序崩溃的时候保存了程序的堆栈等信息,我们执行core文件就可以方便的找程序崩溃的原因了。



一、编译可以调试的代码

   在linux下对于单个c/c++文件编译通常就是加-o 进行编译成可执行文件,但是我们如果需要要调试,则需要加一个 -g 用来向编译器进行表明该程序需要编译成可以gdb调试的代码,加上编译信息,生成的执行文件就会变大,如图所示。所以我们只在调试的时候进行 -g 编译。Java调试的时候也是类似后续也说一哈java的Linux。4edc953e2c684bbe819ffa954c899c08.png

Makefile的文件中我们也是如上,只不过是在Makefile文件中 -o 编译的时候添加 -g4edc953e2c684bbe819ffa954c899c08.png


二、调试过程

调用gdb调试,先查看电脑环境里面是否有gdb调试器,一般我们安装了gcc编译器,就默认同时安装了gdb调试器4edc953e2c684bbe819ffa954c899c08.png

没有的话要安装gdb调试器,使用apt-get 就可以快速安装

apt-get update
apt-get install  gdb

gdb 调用执行文件

gdb ./big_endian /*执行文件*/

最基本的GDB命令

命令 全称 解释
l list 查看源码
b break 设置断点
r run 运行程序,在断点处停止
n next 单条语句执行
c continue 继续运行程序,下一个断点处停止 
p print 打印 变量信息
q quit 退出GDB
delete  delete  删除断点
disp  display   跟踪查看某个变量,每次停下来都显示它的值  
st start    开始执行程序,在main函数的第一条语句前面停下来
watch  watch  监视变量值的变化
file   file   装入需要调试的程序
bt    backtrace  查看函数调用信息(堆栈)  
 f frame      查看栈帧 f n 切换到编号为n的栈
undisp (数字) undisplay  取消显示
help help 帮助命令
set (args 10 20 30 40 50 )   可指定运行参数
s step 执行到函数内部


示例执行:

/*刚开始有很多打印的信息*/
book@lyn:~/Documents/linux/test/wds/wds_c++/c++_test1/c11th$ gdb person1
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from person1...done.
(gdb) l 10  /*list 10  显示10行代码 方便下一步打断点调试*/
5       using namespace std;
6
7       class Person {
8       private:
9               static int cnt;
10              char *name;
11              int age;
12
13      public:
14
(gdb)   /*不输入 直接 Enter 键 重复上一步骤*/
15              static int getCount(void); 
16
17              Person() {//cout <<"Pserson()"<<endl;
18                      name = NULL;
19                      cnt++;
20              }
21              Person(char *name) 
22              {
23                      //cout <<"Pserson(char *)"<<endl;
24                      this->name = new char[strlen(name) + 1];
(gdb) 
25                      strcpy(this->name, name);
26                      cnt++;
27              }
28
29              Person(char *name, int age) 
30              {
31                      cout <<"Pserson(char*, int), name = "<<name<<", age= "<<age<<endl;
32                      this->age = age;
33
34                      this->name = new char[strlen(name) + 1];
(gdb) /*......*/
......
95
96      int main(int argc, char **argv)
97      {
98              Student p;
99              p.setName("zhangsan");
100             p.setAge(16);
101             p.printInfo();
102
103             return 0;
104     }
(gdb) b 99 /*在显示的 第 99行代码处 打断点*/
Breakpoint 1 at 0x400b5d: file person.cpp, line 99.
(gdb) i b /*显示 设置的断点*/
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400b5d in main(int, char**) at person.cpp:99
(gdb) r  /*开始全速执行代码 直到第一个断点处*/
Starting program: /home/book/Documents/linux/test/wds/wds_c++/c++
Breakpoint 1, main (argc=1, argv=0x7fffffffe3d8) at person.cpp:99
99              p.setName("zhangsan");
(gdb) p p  /*打印 p 变量信息*/
$1 = {<Person> = {static cnt = 1, name = 0x0, age = 0}, <No data fields>}
(gdb) n  /*执行下一步*/
100             p.setAge(16);
(gdb) q  /*退出 gdb 调试*/
A debugging session is active.
        Inferior 1 [process 3410] will be killed.
Quit anyway? (y or n) y
(gdb) i disp  /*显示所有的disp变量*/
Auto-display expressions now in effect:
Num Enb Expression
1:   y  ap
2:   y  * ap
3:   y  *ap
4:   y  val
(gdb) undisplay 1 /*取消显示第一个变量*/
(gdb) undisplay 2
(gdb) undisp 3
(gdb) i disp /*查看确认*/
Auto-display expressions now in effect:
Num Enb Expression
4:   y  val
(gdb) s
hanoi (n=3, x=120 'x', y=121 'y', z=122 'z') at Hanoi.c:21
21              if(n==1)                                                        //欲移动n个圆盘,需先移动其上的n-1个圆盘 
(gdb) n
25                      hanoi(n-1, x, z, y);                    //将x上编号为1至n-1的圆盘移到y,z作辅助塔 

这就是我分享的gdb调试一些方法,里面代码是实践过的,如果大家有什么更好的思路,欢迎分享交流哈。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
12天前
|
运维 监控 Linux
BPF及Linux性能调试探索初探
BPF技术从最初的网络数据包过滤发展为强大的系统性能优化工具,无需修改内核代码即可实现实时监控、动态调整和精确分析。本文深入探讨BPF在Linux性能调试中的应用,介绍bpftune和BPF-tools等工具,并通过具体案例展示其优化效果。
40 14
|
1月前
|
缓存 NoSQL Linux
Linux调试
本文介绍了Linux调试、性能分析和追踪的培训资料,涵盖调试、性能分析和追踪的基础知识及常用工具。
241 6
Linux调试
|
23天前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
38 1
|
3月前
|
机器学习/深度学习 安全 网络协议
Linux防火墙iptables命令管理入门
本文介绍了关于Linux防火墙iptables命令管理入门的教程,涵盖了iptables的基本概念、语法格式、常用参数、基础查询操作以及链和规则管理等内容。
242 73
|
1月前
|
Unix Linux Shell
linux入门!
本文档介绍了Linux系统入门的基础知识,包括操作系统概述、CentOS系统的安装与远程连接、文件操作、目录结构、用户和用户组管理、权限管理、Shell基础、输入输出、压缩打包、文件传输、软件安装、文件查找、进程管理、定时任务和服务管理等内容。重点讲解了常见的命令和操作技巧,帮助初学者快速掌握Linux系统的基本使用方法。
74 3
|
2月前
|
机器学习/深度学习 Linux 编译器
Linux入门3——vim的简单使用
Linux入门3——vim的简单使用
61 1
|
2月前
|
Linux Shell Windows
Linux入门1——初识Linux指令
Linux入门1——初识Linux指令
36 0
Linux入门1——初识Linux指令
|
2月前
|
存储 数据可视化 Linux
Linux 基础入门
Linux 基础入门
|
2月前
|
Linux Go 数据安全/隐私保护
Linux入门2——初识Linux权限
Linux入门2——初识Linux权限
30 0
|
4月前
|
Ubuntu Linux
内核实验(四):Qemu调试Linux内核,实现NFS挂载
本文介绍了在Qemu虚拟机中配置NFS挂载的过程,包括服务端的NFS服务器安装、配置和启动,客户端的DHCP脚本添加和开机脚本修改,以及在Qemu中挂载NFS、测试连通性和解决挂载失败的方法。
259 0
内核实验(四):Qemu调试Linux内核,实现NFS挂载