前言
上篇Linux下如何使用gdb启动调试我们讲到了GDB启动调试的多种方式,在 Linux 环境软件开发中,GDB 是主要的调试工具,用来调试 C 和 C++ 程序。今天主要讲GDB的断点设置与查看源码。
为什么要设置断点呢?
当我们想查看变量内容,堆栈情况等等,可以指定断点。程序执行到断点处会暂停执行。break 命令用来设置断点,缩写形式为b。设置断点后,以便我们更详细的跟踪断点附近程序的执行情况。
设置断点有很多方式。下面我们举例说明下常用的几种方式。
通过行号设置断点
格式:
break [行号]
break 行号,断点设置在该行开始处,注意:该行代码未被执行
如果你的程序是用c或者c++写的,那么你可以使用“文件名:行号”的形式设置断点。示例如下:
//test.c
#include <stdio.h>
void judge_sd(int num){
if ((num & 1) == 0){
printf("%d is even\n",num);
return;
}else{
printf("%d is odd\n",num);
return;
}
}
int main(int argc, char const *argv[]){
judge_sd(0);
judge_sd(1);
judge_sd(4);
return 0;
}
编译:
gcc -g test.c -o test
gdb test
break 文件名 : 行号,适用于有多个源文件的情况。
示例中的(gdb) b test.c:18是设置了断点。断点的位置是test.c文件的18行。使用r命令执行脚本时,当运行到18行时就会暂停。注意:该行代码未被执行
通过函数设置断点
格式:
break [函数名]
break 函数名,断点设置在该函数的开始处,断点所在行未被执行:
同样可以将断点设置在函数处:
b judge_sd
设置条件断点
如果按上面的方法设置断点后,每次执行到断点位置都会暂停。有时候非常讨厌。我们只想在指定条件下才暂停。这时候根据条件设置断点就有了用武之地。设置条件断点的形式,就是在设置断点的基本形式后面增加 if条件。示例如下:
break test.c:6 if num>0
当在num>0时,程序将会在第6行断住。
查看断点
语法:
info breakpoints
可以使用info breakpoints查看断点的情况。包含都设置了那些断点,断点被命中的次数等信息。示例如下:
它将会列出所有已设置的断点,每一个断点都有一个标号,用来代表这个断点。
删除断点
语法:
delete breakpoint
对于无用的断点我们可以删除。删除的命令格式为 delete breakpoint 断点编号。info breakpoint命令显示结果中的num列就是编号。删除断点的示例如下:
查看源码
断点设置完后,当程序运行到断点处就会暂停。暂停的时候,我们可以查看断点附近的代码。查看代码的子命令是list,缩写形式为l。
指定行号查看代码
语法:
list first,last
例如,要列出6到21行之间的源码:
列出指定文件的源码
前面执行l命令时,默认列出test.c的源码,如果想要看指定文件的源码呢?可以
list 【文件名加行号或函数名】
总结
本文介绍了GDB调试中的断点设置、源码查看。断点设置可以便于我们后期观察变量,堆栈等信息,为进一步的定位与调试做准备。源码查看可以通过指定行号或者方法名来查看相关代码。
(微信公众号【程序猿编码】)
(添加本人微信号,备注加群,进入程序猿编码交流群,回复:领取学习资料,获取每日干货)
欢迎关注 微信公众号【程序猿编码】,专注于Linux c/c++ 、Python、Go语言、数据结构与算法、网络编程相关知识,常用的程序员工具。还有每日00:10分之前更新 新闻简报,一份【简报】,纵览天下事!