博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c语言之gdb调试。
阅读量:4679 次
发布时间:2019-06-09

本文共 5012 字,大约阅读时间需要 16 分钟。

1.此文档演示如何使用gdb调试c语言代码。

代码如下:

#include 
/*函数声明*/void digui(int n);int main(){ int n=10; digui(n); return 0;}void digui(int n){ printf("level1-value of %d\n",n); if(n>2){ digui(n-1); } printf("level2-value of %d\n",n);}

2.编译debug模式下的程序,编译方式如下:

[zsd@TOMCAT ~]$ gcc -g test03.c -o test03debug

3.进入gdb的debug模式,如下:

[zsd@TOMCAT ~]$ gdb test03debug GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6_4.1)Copyright (C) 2010 Free Software Foundation, Inc.License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.There is NO WARRANTY, to the extent permitted by law. Type "show copying"and "show warranty" for details.This GDB was configured as "x86_64-redhat-linux-gnu".For bug reporting instructions, please see:
...Reading symbols from /home/zsd/test03debug...done.(gdb)

4.gdb模式下,list命令,查看源代码:

(gdb) list1       #include 
2 /*函数声明*/3 void digui(int n);45 int main()6 {7 int n=10;8 digui(n);9 return 0;10 }(gdb) 1112 void digui(int n)13 {14 printf("level1-value of %d\n",n);15 if(n>2){16 digui(n-1);17 } 18 printf("level2-value of %d\n",n);19 }20

5.list的相关命令,如下:

(gdb) set listsize 30   //设置显示行数(gdb) show listsize;   //查看显示行数Number of source lines gdb will list by default is 30.(gdb) list 1,20          //显示1~20行的源代码1       #include 
2 /*函数声明*/3 void digui(int n);45 int main()6 {7 int n=10;8 digui(n);9 return 0;10 }1112 void digui(int n)13 {14 printf("level1-value of %d\n",n);15 if(n>2){16 digui(n-1);17 } 18 printf("level2-value of %d\n",n);19 }20

6.设置断点。

个人思路:由于希望研究递归函数的过程,所以对目前程序的16行和18行,设置断点。操作如下:

(gdb) break 16    //设置16行的断点Breakpoint 1 at 0x40050c: file test03.c, line 16.(gdb) break 18    //设置18行的断点Breakpoint 2 at 0x400519: file test03.c, line 18.(gdb) info breakpoints   //查看断点信息Num     Type           Disp Enb Address            What1       breakpoint     keep y   0x000000000040050c in digui at test03.c:162       breakpoint     keep y   0x0000000000400519 in digui at test03.c:18 删除断点的命令:(这里不执行,只是告知断点的方式)
(gdb) clear 16 (gdb) clear 18

7.开始调试程序

(gdb) run        //开始执行调试程序Starting program: /home/zsd/test03debug level1-value of 10Breakpoint 1, digui (n=10) at test03.c:1616          digui(n-1);       //停止到设置在第一个断点,程序在第16行暂停。Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.x86_64(gdb) contiune              //continue命令,是在碰到断点的情况下,停止Undefined command: "contiune".  Try "help".(gdb) continueContinuing.level1-value of 9     Breakpoint 1, digui (n=9) at test03.c:1616          digui(n-1);      //第二次碰到断点,程序停止,依次递推(gdb) continueContinuing.level1-value of 8Breakpoint 1, digui (n=8) at test03.c:1616          digui(n-1);(gdb) continueContinuing.level1-value of 7Breakpoint 1, digui (n=7) at test03.c:1616          digui(n-1);(gdb) continueContinuing.level1-value of 6Breakpoint 1, digui (n=6) at test03.c:1616          digui(n-1);(gdb) continueContinuing.level1-value of 5Breakpoint 1, digui (n=5) at test03.c:1616          digui(n-1);(gdb) continueContinuing.level1-value of 4Breakpoint 1, digui (n=4) at test03.c:1616          digui(n-1);(gdb) continueContinuing.level1-value of 3Breakpoint 1, digui (n=3) at test03.c:1616          digui(n-1);(gdb) continueContinuing.level1-value of 2Breakpoint 2, digui (n=2) at test03.c:1818        printf("level2-value of %d\n",n);(gdb) continueContinuing.level2-value of 2Breakpoint 2, digui (n=3) at test03.c:1818        printf("level2-value of %d\n",n);(gdb) continueContinuing.level2-value of 3Breakpoint 2, digui (n=4) at test03.c:1818        printf("level2-value of %d\n",n);(gdb) continueContinuing.level2-value of 4Breakpoint 2, digui (n=5) at test03.c:1818        printf("level2-value of %d\n",n);(gdb) continueContinuing.level2-value of 5Breakpoint 2, digui (n=6) at test03.c:1818        printf("level2-value of %d\n",n);(gdb) continueContinuing.level2-value of 6Breakpoint 2, digui (n=7) at test03.c:1818        printf("level2-value of %d\n",n);(gdb) continueContinuing.level2-value of 7Breakpoint 2, digui (n=8) at test03.c:1818        printf("level2-value of %d\n",n);(gdb) continueContinuing.level2-value of 8Breakpoint 2, digui (n=9) at test03.c:1818        printf("level2-value of %d\n",n);(gdb) continueContinuing.level2-value of 9Breakpoint 2, digui (n=10) at test03.c:1818        printf("level2-value of %d\n",n);(gdb) continueContinuing.level2-value of 10Program exited normally.

run,开始运行程序;

continue,程序暂停时继续运行程序的命令;

print 变量名或表达式,打印该变量或者该表达式的值。whatis 变量名或者表达式,可以显示该变量或表达式的数据类型。

print  变量=值,这种形式还可以给对应的变量赋值;类似的还有set variable 变量=值。作用和用print赋值相同。

next,继续执行下一条语句;还有一条命令step,与之类似,不同的是,当下一条语句遇到函数调用的时候,next不会跟踪进入函数,而是继续执行下面的语句,而step命令则会跟踪进入函数内部。

posted on
2018-10-26 16:35 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/zhangshengdong/p/9857218.html

你可能感兴趣的文章
windows平板的开发和选型
查看>>
无平方因子的数(数论初步) By ACReaper
查看>>
C语言截取字符串
查看>>
如何查自己的账单
查看>>
JAVA8学习笔记(二)----三个预定义接口
查看>>
JDBC连接各种数据库的字符串
查看>>
构建之法阅读笔记06
查看>>
CentOS minimal新装配置笔记
查看>>
压缩映象原理的一个应用
查看>>
Aurora — 一个在 MSOffice 内输入 LaTeX 公式的很好用插件
查看>>
关于sql优化的一个小总结
查看>>
Java语言中的正则表达式
查看>>
Java环境变量设置
查看>>
【JBPM4】判断节点decision 方法3 handler
查看>>
filter 过滤器(监听)
查看>>
Linux进程间通信---共享内存
查看>>
Computer Information
查看>>
交换机/路由器上的 S口 F口 E口
查看>>
P1298(矩阵切割)DP
查看>>
wzplayer for delphi demo截图
查看>>