c语言之gdb调试。

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模式下的程序,编译方式如下:

[[email protected] ~]$ gcc -g test03.c -o test03debug

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

[[email protected] ~]$ 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命令则会跟踪进入函数内部。

原文地址:https://www.cnblogs.com/zhangshengdong/p/9857218.html

时间: 2024-11-05 22:46:04

c语言之gdb调试。的相关文章

Go语言-gdb调试

编译Go语言程序的时候,传递-gcflags "-N -l"参数,这样可以忽略Go语言内部做的一些优化,聚合变量和函数等优化 go build -gcflags "-N -l" 常用命令 list显示源码,默认显示10行,例如list 15,显示十行代码,其中第15行在显示的十行里边的中间 break设置断点,后面可以跟代码行号或者函数名 delete删除断点,后面跟上断点设置的序号,这个序号可以通过info breakpoints获取相应的设置的断点序号 back

使用GDB调试Go语言

用Go语言已经有一段时间了,总结一下如何用GDB来调试它! ps:网上有很多文章都有描述,但是都不是很全面,这里将那些方法汇总一下 GDB简介  GDB是GNU开源组织发布的?一个强?大的UNIX下的程序调试?工具.或许,各位?比较喜欢那种图形界?面?方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会 发现GDB这个调试?工具有?比VC.BCB的图形化调试器更强?大的功能.所谓“?寸有所?长,尺有所短”就是这个道理. 目前支持的语言 (GNU gdb (GDB) 7.8

Go语言gdb调试踩坑

整个是一个docker环境 docker版本: 1.12.1,镜像是我自己做的基于ubuntu:14.04.05. 容器操作系统版本: Ubuntu 14.04.5 LTS go版本: 1.6.3 在gdb中执行run命令出错! 错误输出: warning:Error disabling address space randomization: Operation not permitted 环境:docker 解决办法: warning:Error disabling address spac

linux下的C语言开发(gdb调试)

原文: http://blog.csdn.net/feixiaoxing/article/details/7199643 用gdb调试多进程的程序会遇到困难,gdb只能跟踪一个进程(默认是跟踪父进程),而不能同时跟踪多个进程,但可以设置gdb在fork之后跟踪父进程还是子进程.以上面的程序为 #include <stdlib.h> #include <unistd.h> #include <stdio.h> #define MAXLINE 80 int main(voi

c语言gdb调试

GDB 官网 什么是GDB? GDB是GNU Project调试器,它使您可以查看另一个程序在执行过程中正在执行的操作–或该程序崩溃时正在执行的操作. GDB可以做四种主要的事情(以及支持这些事情的其他事情)来帮助您捕获行为中的错误: 启动程序,并指定可能影响其行为的所有内容. 使程序在指定条件下停止. 检查程序停止时发生的情况. 更改程序中的内容,以便您可以尝试纠正一个错误的影响,然后继续学习另一个错误. gdb 调试的一些命令 gcc -g -o xx xx.c // 编译c源程序 gdb

gdb调试命令

本篇摘自互联网,纯属自己学习笔记,然分享给看到我的博客的人们. 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本.UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成在一起,使用几个简单的已有工具的命令,就可以做出一个非常强大的功能. 于是UNIX下的软件比Windows下的软件更能有机地结合,各自发挥各自的长处,组合成更为强劲的功能.而Windows下的图形软件基本上是各自为营,

GDB调试汇编分析

GDB调试汇编分析 代码 本次实践我参照了许多先做了的同学的博客,有卢肖明,高其,张梓靖同学.代码借用的是卢肖明同学的代码进行调试运行. GCC编译 使用gcc -g gdbtest.c -o gdbtest -m32命令在64位的机器上产生32位汇编代码 在使用gdb进行调试运行时,有cgdb和gdb两种工具,我建议大家使用张梓靖同学使用的cgdb工具,因为使用时可以随时看到自己的源代码,看到我们的断点在哪里,每一步返回值到了哪行,更加直观. 分析过程 使用b main指令在main函数处设置

20145234黄斐《信息安全系统设计基础》GDB调试汇编堆栈过程分析(1)

堆栈跟踪 首先编辑一个程序 用gcc编译,再使用gdb调试,发现gdb尚未下载 下载后重新运行gdb 设置断点:b+行号或者"main" 运行:r frame:打印出的信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句. info frame:打印出的信息:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的.函数参数地址及值.局部变量的地址等等. 输入命令disassemble:显示出该代码(main())的汇编形式 info

GO的GDB调试

GoLang语言,学了很久,一直觉得它单步调试有较多问题,最近才知道自已对它了解得太少了.原来GO语言对GDB的版本是至少为gdb7以上,才能比较好的打印任意变量,如果低于这个版本,则才会出一些问题.网上说GDB版本为7.1,本人使用GDB7.8版本测试,确实很不错.以下是记录单步调试使用的几个打印变量.info frame,打印当前栈参数.info locals打印局部变量info args打印参数.bt显示当前堆栈x/3xw &r查看内存 删除调试符号:go build -ldflags “