c语言gdb调试 追踪一个数,c语言之gdb调试。

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

代码如下:

#include

/*函数声明*/

void digui(intn);intmain()

{int n=10;

digui(n);return 0;

}void digui(intn)

{

printf("level1-value of %d",n);if(n>2){

digui(n-1);

}

printf("level2-value of %d",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)2010Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later

This is free software: you are freeto change and redistribute it.

Thereis NO WARRANTY, to the extent permitted by law. Type "show copying"and"show warranty" fordetails.

This GDB was configuredas "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(intn);4

5 intmain()6{7 int n=10;8digui(n);9 return 0;10}

(gdb)11

12 void digui(intn)13{14 printf("level1-value of %d",n);15 if(n>2){16 digui(n-1);17}18 printf("level2-value of %d",n);19}20

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

(gdb) set listsize 30 //设置显示行数

(gdb) show listsize; //查看显示行数

Number of source lines gdb will list by default is 30.

(gdb) list1,20 //显示1~20行的源代码

1 #include

2 /*函数声明*/

3 void digui(intn);4

5 intmain()6{7 int n=10;8digui(n);9 return 0;10}11

12 void digui(intn)13{14 printf("level1-value of %d",n);15 if(n>2){16 digui(n-1);17}18 printf("level2-value of %d",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:16

2 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 10Breakpoint1, digui (n=10) at test03.c:16

16 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 9Breakpoint1, digui (n=9) at test03.c:16

16 digui(n-1); //第二次碰到断点,程序停止,依次递推

(gdb) continueContinuing.

level1-value of 8Breakpoint1, digui (n=8) at test03.c:16

16 digui(n-1);

(gdb)continueContinuing.

level1-value of 7Breakpoint1, digui (n=7) at test03.c:16

16 digui(n-1);

(gdb)continueContinuing.

level1-value of 6Breakpoint1, digui (n=6) at test03.c:16

16 digui(n-1);

(gdb)continueContinuing.

level1-value of 5Breakpoint1, digui (n=5) at test03.c:16

16 digui(n-1);

(gdb)continueContinuing.

level1-value of 4Breakpoint1, digui (n=4) at test03.c:16

16 digui(n-1);

(gdb)continueContinuing.

level1-value of 3Breakpoint1, digui (n=3) at test03.c:16

16 digui(n-1);

(gdb)continueContinuing.

level1-value of 2Breakpoint2, digui (n=2) at test03.c:18

18 printf("level2-value of %d",n);

(gdb)continueContinuing.

level2-value of 2Breakpoint2, digui (n=3) at test03.c:18

18 printf("level2-value of %d",n);

(gdb)continueContinuing.

level2-value of 3Breakpoint2, digui (n=4) at test03.c:18

18 printf("level2-value of %d",n);

(gdb)continueContinuing.

level2-value of 4Breakpoint2, digui (n=5) at test03.c:18

18 printf("level2-value of %d",n);

(gdb)continueContinuing.

level2-value of 5Breakpoint2, digui (n=6) at test03.c:18

18 printf("level2-value of %d",n);

(gdb)continueContinuing.

level2-value of 6Breakpoint2, digui (n=7) at test03.c:18

18 printf("level2-value of %d",n);

(gdb)continueContinuing.

level2-value of 7Breakpoint2, digui (n=8) at test03.c:18

18 printf("level2-value of %d",n);

(gdb)continueContinuing.

level2-value of 8Breakpoint2, digui (n=9) at test03.c:18

18 printf("level2-value of %d",n);

(gdb)continueContinuing.

level2-value of 9Breakpoint2, digui (n=10) at test03.c:18

18 printf("level2-value of %d",n);

(gdb)continueContinuing.

level2-value of 10Program exited normally.

run,开始运行程序;

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值