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或者print来打印那三个变量,但是在这里却自动打印了。这就是断点处自动打印的功能:display的功能
  • 我们退出刚刚的GDB调试,再重新进入GDB调试,然后直接只用run进行运行程序,发现上一次设置的断点和display的设置还在。使用undisplay即可去除display的设置。然后继续运行程序:continue,程序在18行断点处停下,然后我们可以使用下面的一些命令查看程序的一些符号信息:
  • 上图中红色是输入的命令,黄色是显示的类型。
  • 通过上述的命令练习,我们学会了如何在程序运行过程中查看符号的信息。

3 总结

  • 学会使用display进行断点处自动打印功能
  • 学会使用whatis与ptype进行查看符号的信息
  • 本文章参考狄泰软件学院相关课程 想学习的可以加狄泰软件学院群, 群聊号码:199546072

  • 学习探讨加个人(可以免费帮忙下载CSDN资源):

  • qq:1126137994

  • 微信:liu1126137994

  • 学习交流资源分享qq群:962535112