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
然后为其增加调试信息:
我们可以明显观察到加入了调试信息后文件的大小明显发生了改变:
注意:要使用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起来到第九行,通过逐过程来走读代码:
但是我们发现现在并不能够观察到变量的值,那应该怎么办呢?
我们可以用 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/l 行号
显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名
列出某个函数的源代码
r或run
运行程序
n 或 next
单条执行(逐过程)
s或step
进入函数调用(逐语句)
break(b) 行号
在某一行设置断点
break 函数名
在某个函数开头设置断点
info break
查看断点信息
finish
执行到当前函数返回,然后挺下来等待命令
print(p)
打印表达式的值,通过表达式可以修改变量的值或者调用函数
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)
查看各级函数调用及参数
info(i) locals
查看当前栈帧局部变量的值
quit/Ctrl+d
退出gdb
版权归原作者 Fox! 所有, 如有侵权,请联系我们删除。