当前位置:   article > 正文

linux进阶19——GDB(五):单步调试命令(next、step和until)_gdb until

gdb until

一段c语言程序:

  1. #include <stdio.h>
  2. int print(int num){
  3. int ret = num * num;
  4. return ret;
  5. }
  6. int myfunc(int num){
  7. int i = 1;
  8. int sum = 0;
  9. while(i <= num){
  10. sum += print(i);
  11. i++;
  12. }
  13. return sum;
  14. }
  15. int main(){
  16. int num =0;
  17. scanf("%d", &num);
  18. int result = myfunc(num);
  19. printf("%d", result);
  20. return 0;
  21. }

1. next命令

1.1 功能

next 是最常用来进行单步调试的命令,其最大的特点是当遇到包含调用函数的语句时,无论函数内部包含多少行代码,next 指令都会一步执行完。也就是说,对于调用的函数来说,next 命令只会将其视作一行代码。

1.2 语法

(gdb) next count

参数 count 表示单步执行多少行代码,默认为 1 行。

1.3 示例

  1. [root@localhost day5]# gcc test1.c -o test1 -g
  2. [root@localhost day5]# ls
  3. test1 test1.c
  4. [root@localhost day5]# gdb test1 -q
  5. Reading symbols from /home/gdb/day5/test1...done.
  6. (gdb) l 0
  7. 1 #include <stdio.h>
  8. 2 int print(int num){
  9. 3 int ret = num * num;
  10. 4 return ret;
  11. 5 }
  12. 6 int myfunc(int num){
  13. 7 int i = 1;
  14. 8 int sum = 0;
  15. 9 while(i <= num){
  16. 10 sum += print(i);
  17. (gdb)
  18. 11 i++;
  19. 12 }
  20. 13 return sum;
  21. 14 }
  22. 15 int main(){
  23. 16 int num =0;
  24. 17 scanf("%d", &num);
  25. 18 int result = myfunc(num);
  26. 19 printf("%d", result);
  27. 20 return 0;
  28. (gdb)
  29. 21 }
  30. (gdb)
  31. Line number 22 out of range; test1.c has 21 lines.
  32. (gdb) b 16
  33. Breakpoint 1 at 0x4005c8: file test1.c, line 16.
  34. (gdb) r
  35. Starting program: /home/gdb/day5/test1
  36. Breakpoint 1, main () at test1.c:16
  37. 16 int num =0;
  38. Missing separate debuginfos, use: debuginfo-install glibc-2.17-323.el7_9.x86_64
  39. (gdb) n 2
  40. 3
  41. 18 int result = myfunc(num);
  42. (gdb) n <---------跳过myfunc函数,直接到19行的代码
  43. 19 printf("%d", result);
  44. (gdb) n
  45. 20 return 0;
  46. (gdb) p result
  47. $1 = 14
  48. (gdb)

2. step命令

2.1 功能

通常情况下,step 命令和 next 命令的功能相同,都是单步执行程序。不同之处在于,当 step 命令所执行的代码行中包含函数时,会进入该函数内部,并在函数第一行代码处停止执行。

2.2 语法

(gdb) step count

2.3 示例

  1. [root@localhost day5]# clear
  2. [root@localhost day5]# gcc test1.c -o test1 -g
  3. [root@localhost day5]# gdb test1 -q
  4. Reading symbols from /home/gdb/day5/test1...done.
  5. (gdb) l 0
  6. 1 #include <stdio.h>
  7. 2 int print(int num){
  8. 3 int ret = num * num;
  9. 4 return ret;
  10. 5 }
  11. 6 int myfunc(int num){
  12. 7 int i = 1;
  13. 8 int sum = 0;
  14. 9 while(i <= num){
  15. 10 sum += print(i);
  16. (gdb)
  17. 11 i++;
  18. 12 }
  19. 13 return sum;
  20. 14 }
  21. 15 int main(){
  22. 16 int num =0;
  23. 17 scanf("%d", &num);
  24. 18 int result = myfunc(num);
  25. 19 printf("%d", result);
  26. 20 return 0;
  27. (gdb)
  28. 21 }
  29. (gdb) b 18
  30. Breakpoint 1 at 0x4005e5: file test1.c, line 18.
  31. (gdb) r
  32. Starting program: /home/gdb/day5/test1
  33. 3
  34. Breakpoint 1, main () at test1.c:18
  35. 18 int result = myfunc(num);
  36. Missing separate debuginfos, use: debuginfo-install glibc-2.17-323.el7_9.x86_64
  37. (gdb) step <------------程序进入mufunc函数,并在第一行代码处停止
  38. myfunc (num=3) at test1.c:7
  39. 7 int i = 1;
  40. (gdb)

3. until命令

3.1 语法

  1. 1、(gdb) until
  2. 2、(gdb) until location

其中,参数 location 为某一行代码的行号。until 命令可以简写为 u 命令。

不带参数的 until 命令,可以使 GDB 调试器快速运行完当前的循环体,并运行至循环体外停止。注意,until 命令并非任何情况下都会发挥这个作用,只有当执行至循环体尾部(最后一行代码)时,until 命令才会发生此作用;反之,until 命令和 next 命令的功能一样,只是单步执行程序。

3.2 示例

  1. [root@localhost day5]# gdb test1 -q
  2. Reading symbols from /home/gdb/day5/test1...done.
  3. (gdb) l 0
  4. 1 #include <stdio.h>
  5. 2 int print(int num){
  6. 3 int ret = num * num;
  7. 4 return ret;
  8. 5 }
  9. 6 int myfunc(int num){
  10. 7 int i = 1;
  11. 8 int sum = 0;
  12. 9 while(i <= num){
  13. 10 sum += print(i);
  14. (gdb)
  15. 11 i++;
  16. 12 }
  17. 13 return sum;
  18. 14 }
  19. 15 int main(){
  20. 16 int num =0;
  21. 17 scanf("%d", &num);
  22. 18 int result = myfunc(num);
  23. 19 printf("%d", result);
  24. 20 return 0;
  25. (gdb)
  26. 21 }
  27. (gdb)
  28. Line number 22 out of range; test1.c has 21 lines.
  29. (gdb) b 17
  30. Breakpoint 1 at 0x4005cf: file test1.c, line 17.
  31. (gdb) r
  32. Starting program: /home/gdb/day5/test1
  33. Breakpoint 1, main () at test1.c:17
  34. 17 scanf("%d", &num);
  35. Missing separate debuginfos, use: debuginfo-install glibc-2.17-323.el7_9.x86_64
  36. (gdb) u
  37. 3
  38. 18 int result = myfunc(num);
  39. (gdb) step
  40. myfunc (num=3) at test1.c:7
  41. 7 int i = 1;
  42. (gdb) u
  43. 8 int sum = 0;
  44. (gdb) u
  45. 9 while(i <= num){
  46. (gdb) u
  47. 10 sum += print(i);
  48. (gdb) u
  49. 11 i++;
  50. (gdb) u
  51. 9 while(i <= num){
  52. (gdb) u <-------------重点:快速执行完循环体
  53. 13 return sum;
  54. (gdb) p sum
  55. $1 = 14
  56. (gdb)

until 命令还可以后跟某行代码的行号,以指示 GDB 调试器直接执行至指定位置后停止。举个例子:

  1. [root@localhost day5]# gdb test1 -q
  2. Reading symbols from /home/gdb/day5/test1...done.
  3. (gdb) l 0
  4. 1 #include <stdio.h>
  5. 2 int print(int num){
  6. 3 int ret = num * num;
  7. 4 return ret;
  8. 5 }
  9. 6 int myfunc(int num){
  10. 7 int i = 1;
  11. 8 int sum = 0;
  12. 9 while(i <= num){
  13. 10 sum += print(i);
  14. (gdb)
  15. 11 i++;
  16. 12 }
  17. 13 return sum;
  18. 14 }
  19. 15 int main(){
  20. 16 int num =0;
  21. 17 scanf("%d", &num);
  22. 18 int result = myfunc(num);
  23. 19 printf("%d", result);
  24. 20 return 0;
  25. (gdb)
  26. 21 }
  27. (gdb)
  28. Line number 22 out of range; test1.c has 21 lines.
  29. (gdb) b 17
  30. Breakpoint 1 at 0x4005cf: file test1.c, line 17.
  31. (gdb) r
  32. Starting program: /home/gdb/day5/test1
  33. Breakpoint 1, main () at test1.c:17
  34. 17 scanf("%d", &num);
  35. Missing separate debuginfos, use: debuginfo-install glibc-2.17-323.el7_9.x86_64
  36. (gdb) until 19 <-------------------直接执行至第19行停止
  37. 3
  38. main () at test1.c:19
  39. 19 printf("%d", result);
  40. (gdb) p result <---------------打印result结果
  41. $1 = 14
  42. (gdb)

可以看到,通过执行 until 19 命令,GDB 调试器直接从第 17 行代码处执行至指定的第 19 行。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/804682
推荐阅读
相关标签
  

闽ICP备14008679号