gdb是the GNU Debugger的简称。它是一款UNIX平台的调试器(debugger),可用于为C, C++, Objective-C, Java, Fortran等程序debug。

在gdb中,你可以通过设置断点(break point)来控制程序运行的进度,并查看断点时的变量和函数调用状况,从而发现可能的问题。在许多IDE中,gdb拥有图形化界面。

一、初次使用gdb调试器,出现的No symbol table is loaded. Use the "file" command.问题:

首先使用gcc   -g    .c文件   -o  可执行文件名  进行编译;再使用gdb + 可执行文件名进入gdb环境,进行调试。

为了使用gdb对进行调试,必须使用-g选项(在编译时生成debug信息)

命令如下如:

#gcc -g test.c -o test 
#gdb test

如果上一步gdb + 不是 -g编译后的 可执行文件,而是 gdb  ./a.out ,则会出现 Use the "file" command.问题

(gdb)list

list命令是用来列出源码的。
   详细的list的使用查看文章《 debug —— list调试命令》

(2)   gdb  test

(3)  list等gdb命令;

(如有必要,使用:$chmod +x test来增加用户的执行权限。)

二、使用gdb调试:

1》启动gdb:

[root@node-2 jieer]# gcc -g struct.c -o struct
[root@node-2 jieer]# gdb struct

2》显示程序:详细的list的使用查看文章《 debug —— list调试命令》

<1> 将显示以第3行为中心,总共10行的程序。

如果要查看某个文件中的内容,需要说明文件名(例如:(gdb) list struct.c:12)。

(gdb) list 3

<2>可以具体说明所要列出的程序行的范围(即 显示5-15行的程序).

(gdb) list 5,15

<3>显示某个函数.

(gdb) list main

3》设置断点

<1>我们可以在程序的某一行设置断点,比如:

(gdb) break 16  (或者是简写   b  16)

将在test.c的第16行设置断点。

<2>你可以查看自己设置的断点:

(gdb) info break

<3>每个断点有一个识别序号。我们可以根据序号删除某个断点:

(gdb) delete 1

<4>也可以删除所有断点:

(gdb) delete breakpoints

到目前为止,程序内变量的赋值都是在程序内部完成的,如果程序内的一些变量需要执行文件的时候,用命令行传入呢?
例如:需要你打印出argv[0]、argv[1]、argv[2]的值得一个函数你该如何操作呢?

《可以查看文章《debug —— set args调试命令(作为程序运行时的参数)》

4》保存断点

<1>

(gdb) info break

Num Type Disp Enb Address What

1 breakpoint keep y 0x0000000000400536 in main at struct.c:12

2 breakpoint keep y 0x0000000000400547 in main at struct.c:13

<2>

(gdb) save breakpoint fig.dp

Saved to file 'fig.dp'.

<3>

[root@node-2 jieer]# gdb struct -x fig.dp 

GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7_4.1

Copyright (C) 2013 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 WA RRANTY, 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 /root/jieer/struct...done.

Breakpoint 1 at 0x400536: file struct.c, line 12.

Breakpoint 2 at 0x400547: file struct.c, line 13.

5》运行控制

<1>让程序从断点开始,再多运行一行(可以看函数内嵌套的另一个函数的内容):

(gdb) step  (可以用简写  s)
源代码:21 int ccc(){22         int total = 0;23         char other[512] = {'\0'};24 25         bbb(&total);26         printf("ccc:total=%d\n",total);27         printf("ccc:total=%p\n",&total);28         ddd(other);29 }30 int main(){31         ccc();32         return 0;33 }

步骤1:在文件内第30行设置一个断点,即在test.c文件,mian函数中第30 行。
步骤2:运行程序:可以看到执行到ccc()函数哪一行了;
步骤3:执行s命令:从此处开始多运行一行,进入ccc()函数内部;
步骤4,5:继续调试函数:看到bbb()函数,这是很确定我们进入了ccc()函数中了。

那么不用s命令会有怎么的结果呢?我们来看一下

<2>也可以使用下面命令,从断点恢复运行,直到下一个断点:

(gdb) continue

<3>使用run重新开始运行

(gdb) run

程序正常结束。

6》退出

使用下面命令退出gdb:

(gdb) quit  (可以使用简写 q   或者   .qu)

三、举例分析:

1》struct.c文件的源码如下:

  1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 struct student5 {6         char *name;7         int score;8 }stu,*pstu;9 10 int main()11 {12         stu.name = (char *)malloc(20*sizeof(char));13         strcpy(stu.name,"jie");14         stu.score = 90;15 16         pstu = (struct student *)malloc(sizeof(struct student));17         pstu->name = (char *)malloc(20*sizeof(char));18         strcpy(pstu->name,"jieer");19         pstu->score = 9;20 21         return 0;22 }

2》具体操作如下:

[root@node-2 jieer]# gcc -g struct.c -o struct[root@node-2 jieer]# gdb struct
(gdb) break 12

Breakpoint 1 at 0x400536: file struct.c, line 12.

(gdb) break 13

Breakpoint 2 at 0x400547: file struct.c, line 13.

(gdb) r

Starting program: /root/jieer/struct

Breakpoint 1, main () at struct.c:12

12 stu.name = (char *)malloc(20*sizeof(char));

Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7_4.2.x86_64

(gdb) p stu.name 

$1 = 0x0

(gdb) c

Continuing.

Breakpoint 2, main () at struct.c:13

13 strcpy(stu.name,"jie");

(gdb) p stu.name

$2 = 0x602010 ""

(gdb) quit

A debugging session is active.

Inferior 1 [process 12909] will be killed.

Quit anyway? (y or n) y

debug —— C语言 编译时候进行debug的调试相关推荐

  1. 关于Debug和Release编译方式

    问:怎么在VC6中把工程编译成release版本? 答:可以project->Set Active Config,选中release版本.此后,按F5或F7编译所得的结果就是release版本. ...

  2. Debug 和 Release 编译方式

    Debug 和 Release 编译方式的区别本文主要包含如下内容: 1. Debug 和 Release 编译方式的本质区别 2. 哪些情况下 Release 版会出错 3. 怎样"调试& ...

  3. fatal error C1083: 无法打开预编译头文件:“Debug\opencv.pch”: No such file or directory

    fatal error C1083: 无法打开预编译头文件:"Debug\opencv.pch": No such file or directory 步骤/方法: 右键点击你创建 ...

  4. fatal error C1083: 无法打开预编译头文件:“Debug\a.pch”:No such file or directory

    一.解决方法 右键点击你创建的项目,选择"属性标签"点击属性,弹出"项目属性页",在左侧找到以下位置  配置属性 -->  C/C++  --> 预 ...

  5. linux release 版本的区别,编译debug版本和编译release版本的区别

    大项目的版本编译会区别debug和release,那debug和release会有什么区别呢? 通过对比这两者的编译选项可以找到答案. 1.对比编译过程 debug: -DOS_LINUX  -DDE ...

  6. 自己动手,在macOS High Sierra中编译一个可debug的JDK

    背景 由于最近想分析几个native方法,所以需要手头有一个可以debug的JDK,因此,这两天折腾了折腾,踩了10+个坑,看了10+篇文章,尝试了10+次,最后总算把JDK给编出来了,当在自己编译出 ...

  7. idea 使用debug模式自动编译的设置

    idea 使用debug模式自动编译的设置 记录一下使用idea的时候的问题,这个就是类似于myeclipse的debug模式修改代码后就能后直接看出效果,但是我使用的时候有一个问题,就是需要先请求一 ...

  8. java中unknown source,java - 对于 提示信息为 unknown source的解决办法: jdk 替换jre, 编译时加上debug=true...

    java - 对于 提示信息为 unknown source的解决办法: jdk 替换jre, 编译时加上debug=true 2017-08-09 10:43 访问量: 4466 分类: 技术 昨天 ...

  9. 错误:error C1853:Debug\...pch预编译头文件来自编译器版本,或者预编译头C++而在C中使用它

    错误:error C1853:"Debug\...pch"预编译头文件来自编译器版本,或者预编译头C++而在C中使用它(或相反) 原因: 因为当项目中混合了.cpp和.h文件时,编 ...

最新文章

  1. 微软某员工后悔跳槽阿里:工资才多20万不到,天天加班快崩溃!
  2. SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户
  3. Spring WebApplicationContext
  4. 第三次学JAVA再学不好就吃翔(part10)--基础语法之if语句
  5. java记事本课程设计,java记事本课程设计
  6. html5调用手机摄像头和相册,h5 调用手机摄像头/相册
  7. 二、项目运行环境【PMP 】
  8. Word 2003中为什么修改一个段落的文章结果整篇文档的格式都变?
  9. 《天天数学》连载26:一月二十六日
  10. html文件的获取,获取html文件Java
  11. Vivado入门创建工程之----自定义ip及其使用
  12. C# 自定义控件基础知识
  13. Linux系统开发: 学习Linux下网络编程
  14. “矢量网络分析仪”检测同轴电缆的驻波比(SWR)
  15. PLC内部等效电路怎么设计?
  16. time_expire时间过短,刷卡至少1分钟,其他5分钟
  17. ksh 命令退出状态
  18. Java的JDK和JRE
  19. android异常相机处理,android 调用系统相机拍照的各种异常处理
  20. uni-app解决百度API h5跨域问题

热门文章

  1. 理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
  2. 数据结构——算法的基本概念
  3. ORA-38301:can not perform DDL/DML over objects in Recycle Bin
  4. SQL Server 创建定时任务JOB
  5. 【Spring-web】RestTemplate源码学习——梳理内部实现过程
  6. 传递给后台的Json数据解析
  7. VerifyError: Error #1107: ABC 数据已损坏,尝试的读取操作超出范围
  8. ACM PKU 1192 最优连通子集
  9. 自适应IFRAME的大小
  10. cpp 条件判断 大于等于_第31p,if条件语句,请满足我的要求