【Linux调试器-gdb使用】

简介: 【Linux调试器-gdb使用】

1. 背景

通过c语言的学习我们知道程序的发布方式有两种,debug模式和release模式,debug模式就是我们所说的调试模式。我们已经熟悉了在Windows平台下VS系列的调试,接下来我们一起在无图形化界面的Linux下来看看究竟如何调试吧!

2. 使用

首先我们先创建一个c++文件,并向里面写入代码:

 #include<iostream>
  2 using namespace std;
  3 
  4 int AddSum(int& n)                                                                                                                      
  5 {
  6   int sum=0;
  7   for(int i=1;i<=n;i++)
  8   {
  9     sum+=i;
 10   }
 11   return sum;
 12 }
 13 
 14 int main()
 15 {
 16   int num=10;
 17   int sum=AddSum(num);
 18   cout<<sum<<endl;
 19   return 0;
 20 }

运行一下:

[grm@VM-8-12-centos lesson3]$ g++ test.cpp
[grm@VM-8-12-centos lesson3]$ ll
total 16
-rwxrwxr-x 1 grm grm 8960 Jan  4 22:12 a.out
-rw-rw-r-- 1 grm grm  219 Jan  4 22:11 test.cpp
[grm@VM-8-12-centos lesson3]$ ./a.out
55

然后为其增加调试信息:

我们可以明显观察到加入了调试信息后文件的大小明显发生了改变:

3585de72186243868437da3631164f67.png

注意:要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

接下来就开始调试:gdb+binFile (可执行文件)

退出: ctrl + d quit

[grm@VM-8-12-centos lesson3]$ gdb a.out
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.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/>...
Reading symbols from /home/grm/lesson3/a.out...done.
(gdb) l
7   for(int i=1;i<=n;i++)
8   {
9     sum+=i;
10    }
11    return sum;
12  }
13  
14  int main()
15  {
16    int num=10;
(gdb) r
Starting program: /home/grm/lesson3/a.out 
55
[Inferior 1 (process 11983) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64 libgcc-4.8.5-44.el7.x86_64

这里的l表示:list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

r:  r或run:运行程序 (类似于VS中的f5)

再来介绍两个比较常用的命令:n 和 s

n 或 next:单条执行   (逐过程,VS下为f10)

s或step:进入函数调用  (逐语句,VS下为f11)

在介绍这两个命令前还得介绍一个打断点的命令,break(b) 行号:在某一行设置断点

当然还可以在指定文件中某一行或者某个函数打断点也是可行的:b 文件名:函数名(行号)

我们不妨在第九行设置一个断点,然后ran起来到第九行,通过逐过程来走读代码:

833525f2f3894deb965d1f6d982ac8cb.png

但是我们发现现在并不能够观察到变量的值,那应该怎么办呢?

我们可以用 display 变量名:跟踪查看一个变量,每次停下来都显示它的值

(gdb) display sum
1: sum = 1
(gdb) display i
2: i = 1
(gdb) n
Breakpoint 1, AddSum (n=@0x7fffffffe448: 10) at test.cpp:9
9     sum+=i;
2: i = 2
1: sum = 1
(gdb) n
7   for(int i=1;i<=n;i++)
2: i = 2
1: sum = 3
(gdb) n
Breakpoint 1, AddSum (n=@0x7fffffffe448: 10) at test.cpp:9
9     sum+=i;
2: i = 3
1: sum = 3

当我们通过display展示变量名时可以发现每次逐过程进行的时候都将会把display的变量打印出来。取消的话就用 undisplay + 变量名。

我们还可以用until来跳转至想要跳转的行数:until X行号:跳至X行

会将程序运行到我们跳转到的行数。

假如我们想要只跑过该函数就停下来就可以用:finish

从一个断点运行到另外一个断点就用:continue(c)

3 命令总结

另外还有一些指令大家可以下去自己研究,我这里列了一个表格方便大家参考:

list行号

显示binFile源代码,接着上次的位置往下列,每次列10行。

list函数名

列出某个函数的源代码

rrun

运行程序

next

单条执行(逐过程)

sstep

进入函数调用(逐语句)

break(b) 行号

在某一行设置断点

break 函数名

在某个函数开头设置断点

info break

查看断点信息

finish

执行到当前函数返回,然后挺下来等待命令

print(p)

打印表达式的值,通过表达式可以修改变量的值或者调用函数

变量

打印变量值

set var

修改变量的值

continue(c)

从当前位置开始运行到下一个断点而非单步执行程序

delete breakpoints

删除所有断点

delete breakpoints n

:删除序号为n的断点(注意是序号不是行数)

disable breakpoints

禁用断点

enable breakpoints

启用断点

info(i) breakpoints

参看当前设置了哪些断点

display 变量名

跟踪查看一个变量,每次停下来都显示它的值

undisplay

取消对先前设置的那些变量的跟踪

until X行号

until X行号

breaktrace(bt)

查看各级函数调用及参数

infoi) locals

查看当前栈帧局部变量的值

quit/Ctrl+d

退出gdb


相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
2月前
|
安全 Linux iOS开发
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
376 53
Binary Ninja 5.1.8104 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
|
2月前
|
Linux API iOS开发
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
234 14
Binary Ninja 4.2.6455 (macOS, Linux, Windows) - 反编译器、反汇编器、调试器和二进制分析平台
|
7月前
|
NoSQL Linux 编译器
GDB符号表概念和在Linux下获取符号表的方法
通过掌握这些关于GDB符号表的知识,你可以更好地管理和理解你的程序,希望这些知识可以帮助你更有效地进行调试工作。
340 16
|
6月前
|
NoSQL Linux 开发工具
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
本文介绍了yum 包管理工具、Vim 编辑器、gcc/g++ 编译器、gdb 调试器、编译原理及 Makefile 的使用,同时还配备了如何使用,以及图解。旨在帮助读者更好地理解和应用这些工具与技术。
353 0
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
231 10
|
NoSQL Linux 编译器
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
如何配置环境并使用QEMU虚拟机结合GDB进行Linux内核代码的断点调试,包括安装QEMU、交叉编译工具链,编译内核以及通过GDB远程连接进行调试的详细步骤。
1351 0
内核实验(一):使用QEMU+GDB断点调试Linux内核代码
|
3月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
475 1
二、Linux文本处理与文件操作核心命令
|
3月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
325 137
|
3月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
760 57

热门文章

最新文章