- 上一篇文章学习了如何使用GDB进行函数调用栈的查看:【软件开发底层知识修炼】十六 快速学习GDB调试四 使用GDB进行函数调用栈的查看
- 本篇文章是GDB调试快速学习系列的最后一篇。将综合前几篇文章做一个小的总结以及介绍一些在调试中使用的小技巧
1 调试中的小技巧
直接上一个图,下面就是今天介绍的几个技巧命令:
- 其中shell命令,后面代码调试分析的时候就明白了。
1.1 断点处自动打印示例
- 可以看出,当我们在test.c的18行打上断点,运行程序到断点处,然后使用display命令,打印几个值。那么在下一次,如果程序继续运行,又到了test.c的18行的这个断点处,那么GDB会自动将刚刚使用display打印的那几个值打印出来。而不用像我们以前一样,每一次想看哪个值都需要使用print命令。
1.2 使用GDB进行符号查看
- 符号查看可以看到符号的类型。并且我们从上图中也可以看到whatis与ptype的区别:ptype可以查看更加详细的类型。
2 使用GDB进行代码调试中的技巧案例分析
tricks.c
#include <stdio.h>
int g_var = 1;
struct ST
{
int i;
int j;
};
int func()
{
struct ST st[5] = {0};
int i = 0;
for(i=0; i<5; i++)
{
st[i].i = i;
st[i].j = i * i;
}
for(i=0; i<5; i++)
{
printf("st[%d].i = %d\n", i, st[i].i);
printf("st[%d].j = %d\n", i, st[i].j);
}
}
int main()
{
static c_var = 2;
func();
return 0;
}
- 上述程序比较简单,这里不多做解释
- 我们以前都是编译好程序之后,再进入GDB进行调试。现在知道GDB支持shell,那么可以在先进入GDB后,再进行编译。在GDB中,前面加上shell命令,后面可以跟任何shell所支持的命令,如下动态图就是支持shell的各种命令的演示,编译好程序后直接start:
- 然后我们对tricks.c的18行进行打断点(使用
break tricks.c:18
命令)。并使用list tricks.c:18
命令查看tricks.c的18行上下的部分内容。如下图:
- 我们发现,这个展示的内容不够详细,我们想要展示tricks.c的18行上下附近更多的内容,可以使用
set listsize 20
来设置list每次展示的内容的行数,如下图所示:
- 接下继续运行程序:
continue
- 到了18行的时候,就停下来了,此时我们使用如下三个命令来显示
i,i*i,以及&i
:
display /d i
display /d i*i
display /a &i
- 结果如下图所示:
- 可以看到,每一次展示都打印出了我们所想要的值。接着我们继续运行程序:
continue
由于有一个for循环,所以还会在18行再次停止执行,然而这次停止执行后,就会自动打印刚刚我们使用display所想要展示的三个值,如下图:
- 很明显,我们并没有再使用
display
或者display
的功能
- 我们退出刚刚的GDB调试,再重新进入GDB调试,然后直接只用run进行运行程序,发现上一次设置的断点和display的设置还在。使用undisplay即可去除display的设置。然后继续运行程序:continue,程序在18行断点处停下,然后我们可以使用下面的一些命令查看程序的一些符号信息:
- 上图中红色是输入的命令,黄色是显示的类型。
- 通过上述的命令练习,我们学会了如何在程序运行过程中查看符号的信息。
3 总结
- 学会使用display进行断点处自动打印功能
- 学会使用whatis与ptype进行查看符号的信息
本文章参考狄泰软件学院相关课程 想学习的可以加狄泰软件学院群, 群聊号码:199546072
学习探讨加个人(可以免费帮忙下载CSDN资源):
qq:1126137994
微信:liu1126137994
学习交流资源分享qq群:962535112