东瑜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  135 随笔 :: 0 文章 :: 11 评论 :: 21万 阅读

作者:@张扶摇
本文为作者原创,转载请注明出处:https://www.cnblogs.com/zhangshengdong/p/9857218.html


目录

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

代码如下:

复制代码
#include <stdio.h>
/*函数声明*/
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 <http://gnu.org/licenses/gpl.html>
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:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/zsd/test03debug...done.
(gdb) 
复制代码

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

复制代码
(gdb) list
1       #include <stdio.h>
2       /*函数声明*/
3       void digui(int n);
4
5       int main()
6       {
7         int n=10;
8         digui(n);
9         return 0;
10      }
(gdb) 
11
12      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 <stdio.h>
2       /*函数声明*/
3       void digui(int n);
4
5       int main()
6       {
7         int n=10;
8         digui(n);
9         return 0;
10      }
11
12      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            What
1       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 10

Breakpoint 1, 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) continue
Continuing.
level1-value of 9     

Breakpoint 1, digui (n=9) at test03.c:16
16          digui(n-1);      //第二次碰到断点,程序停止,依次递推
(gdb) continue
Continuing.
level1-value of 8

Breakpoint 1, digui (n=8) at test03.c:16
16          digui(n-1);
(gdb) continue
Continuing.
level1-value of 7

Breakpoint 1, digui (n=7) at test03.c:16
16          digui(n-1);
(gdb) continue
Continuing.
level1-value of 6

Breakpoint 1, digui (n=6) at test03.c:16
16          digui(n-1);
(gdb) continue
Continuing.
level1-value of 5

Breakpoint 1, digui (n=5) at test03.c:16
16          digui(n-1);
(gdb) continue
Continuing.
level1-value of 4

Breakpoint 1, digui (n=4) at test03.c:16
16          digui(n-1);
(gdb) continue
Continuing.
level1-value of 3

Breakpoint 1, digui (n=3) at test03.c:16
16          digui(n-1);
(gdb) continue
Continuing.
level1-value of 2

Breakpoint 2, digui (n=2) at test03.c:18
18        printf("level2-value of %d\n",n);
(gdb) continue
Continuing.
level2-value of 2

Breakpoint 2, digui (n=3) at test03.c:18
18        printf("level2-value of %d\n",n);
(gdb) continue
Continuing.
level2-value of 3

Breakpoint 2, digui (n=4) at test03.c:18
18        printf("level2-value of %d\n",n);
(gdb) continue
Continuing.
level2-value of 4

Breakpoint 2, digui (n=5) at test03.c:18
18        printf("level2-value of %d\n",n);
(gdb) continue
Continuing.
level2-value of 5

Breakpoint 2, digui (n=6) at test03.c:18
18        printf("level2-value of %d\n",n);
(gdb) continue
Continuing.
level2-value of 6

Breakpoint 2, digui (n=7) at test03.c:18
18        printf("level2-value of %d\n",n);
(gdb) continue
Continuing.
level2-value of 7

Breakpoint 2, digui (n=8) at test03.c:18
18        printf("level2-value of %d\n",n);
(gdb) continue
Continuing.
level2-value of 8

Breakpoint 2, digui (n=9) at test03.c:18
18        printf("level2-value of %d\n",n);
(gdb) continue
Continuing.
level2-value of 9

Breakpoint 2, digui (n=10) at test03.c:18
18        printf("level2-value of %d\n",n);
(gdb) continue
Continuing.
level2-value of 10

Program exited normally.
复制代码

run,开始运行程序;

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

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

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

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



感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接
posted on   东瑜  阅读(3812)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
\\页脚html代码
点击右上角即可分享
微信分享提示