GDB调试利器

您所在的位置:网站首页 gdb如何单步调试 GDB调试利器

GDB调试利器

2024-07-14 05:58| 来源: 网络整理| 查看: 265

前言

前面两篇已经对Linux下如何使用gdb启动调试,GDB调试利器-断点设置与查看源码我们已经了解了GDB基本的启动调试,设置断点,查看源码等,如果这些内容你还不知道,建议先回顾一下前面的内容。

断点附近的代码你了解后,这时候你就可以使用单步执行一条一条语句的去执行。可以随时查看执行后的结果。接下来你可能会想知道程序运行的一些情况,就需要查看变量的值。下面介绍单步调试与设置变量。

单步调试

居然是调试代码,还是老规矩,先上代码:

//test.c #include 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

程序的功能比较简单,这里不多做解释。断点附近的代码你了解后,这时候你就可以使用单步执行一条一条语句的去执行。可以随时查看执行后的结果。单步执行有两个命令,分别是step和next。我们可能打了多处断点,或者断点打在循环内,这个时候,可以使用continue命令。这三个命令的区别在于:

1、next命令(可简写为n)用于在程序断住后,继续执行下一条语句。 2、step命令(可简写为s),它可以单步跟踪到函数内部。 3、continue命令(可简写为c)或者fg,它会继续执行程序,直到再次遇到断点处。

单步进入-step

step 一条语句一条语句的执行。它有一个别名,s。它可以单步跟踪到函数内部。

先用list(可简写为l)将源码列出来,例如: 在这里插入图片描述 先启动调试,然后把源码列出来。

在这里插入图片描述 从上面的过程可以看到,在5行设置断点,运行程序,可见,step命令进入到了被调用函数中judge_sd。使用step命令也会在这个方法中一行一行的单步执行。但是如果没有该函数源码,需要跳过该函数执行,可使用finish命令,继续后面的执行。

单步执行-next

next命令示例:

在这里插入图片描述

next命令(可简写为n)用于在程序断住后,继续执行下一条语句。上面的信息在5行处打断点,然后运行到6行,然后输入 运行n 2,则会单步执行两行。可见,使用next命令只会在本方法中单步执行。

继续执行到下一个断点-continue

我们可能打了多处断点,或者断点打在循环内,这个时候,想跳过这个断点,甚至跳过多次断点继续执行该怎么做呢?可以使用continue命令。它的作用就是从暂停处继续执行。命令的简写形式为c。继续执行过程中遇到断点或者观察点变化依然会暂停。示例代码如下:

在这里插入图片描述

跳过执行–skip

在这里插入图片描述

根据上面的信息可以看到,使用skip之后,将不会进入judge_sd函数。好处就是skip可以在step时跳过一些不想关注的函数或者某个文件。

如果想删除skip,使用skip delete [num] 。

查看变量

现在你已经会设置断点,查看断点附近的代码,并可以单步执行和继续执行。接下来你可能会想知道程序运行的一些情况,如查看变量的值。print命令正好满足了你的需求。以帮助我们进一步定位问题。

格式:

print[变量名]

print(可简写为p)打印变量内容。示例代码如下:

//test.c #include #include //malloc,free,rand int main(int argc, char const *argv[]) { int input; int i ; printf("Please enter the length of the string:"); scanf("%d",&input); char *buf = (char *) malloc(input + 1);//字符最后包含'\0' if (buf == NULL) { printf("malloc failed!\n"); return -1; } //随机生成字符串 for ( i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3