1.启动和退出gdb

gdb调试的对象是可执行文件,而不是程序源代码。如果要使一个可执行文件可以被gdb调试,那么在使用编译器gcc编译程序时加入-g选项。-g选项告诉gcc在编译程序时加入调试信息,这样gdb才可以调试这个被编译的程序。

程序为求100内偶数和

#include<stdio.h>
int Sum(int a)
{
int i = 0;
if(a<1)
return -1;
for(a; a>2; a-=2)
{
i += a;
}
return i;
}
int main()
{
int a = 100;
printf("%d\n",Sum(a));
}

启动

gdb 程序文件名

示例

前面大段内容为版权信息,在启动gdb使用

gdb -q 程序文件名(等价于 gdb -q 换行  (gdb) file 程序文件名)即可去除版权信息文字

退出

(gdb)quit

2.显示和查找程序源代码

list :显示10行代码,再次运行则显示接下来的10行代码

list 3, 7:显示3到7行代码

list main.c :4, 10:显示源文件main.c的4到10行代码,在调试含有多个源文件的程序时使用

list Max:显示Max函数周围的代码

list test.c:Max: 显示源文件test.c中Max函数周围的代码,在调试含有多个源文件的程序时使用。

示例

如果要在调试时运行shell指令,则可以在gdb的提示符下输入shell命令

(gdb)shell gdb

search 字符串

forward 字符串

这俩命令都是从当前行向后查找第一个匹配字符串的

先前查字符串的命令为

reverse-search 字符串

3.执行程序和获得帮助

使用gdb -q test 或者file test只是装入了程序,程序并没有运行。如果程序要开始运行,在gdb提示符下输入run即可。

如果想了解gdb某个命令的用法,可以使用help命令。

(gdb)help list

4.设置和管理断点

为了在程序运行时查看变量的变化,或者某个中间表达式的值,需要程序在运行到某行停下时,设置断点即为最好的办法。

①以行号设置断点

在gdb里,大部分都是使用break命令为程序设置断点的。而指定断点时,最常用的即为为某行设置断点。例如

第二行是设置断点的反信息,1表示当前设置的是第一个断点,0x800066b是断点所在内存地址,file v.c,line 7表明断点设置在v.c文件的地起航处。

已经在第7行设置好了断点,我们试着运行下程序。

已暂停在断点处。

②以函数名设置断点

(gdb)break 函数名

③以条件表达式设置断点

break 行号或函数名 if 条件,例如

⑤查看当前所有断点

info breakpoints 

⑥使中断失效或者有效

使用“disable  断点号”命令可以使某个断点失效,程序运行到该点不会停下而是继续运行,使用“enable  断点号”命令可以让某个断点恢复有效。

⑦删除断点

clear  删除程序中所有断点

clear 行号  删除该行的断点

clear 函数名  删除该函数的断点

delete 断点号  删除指定编号的断点

注意到函数Sum()内有两个断点1和4,clear Sum 命令后,发现仅删除一个断点,即行数最小的断点

5.控制程序的执行

①continue 命令

让程序继续运行,直到下一个断点或者运行结束为止,命令格式为

continue

②kill 命令

该命令用于结束当前程序的调试,在gdb提示符下输入kill,gdb会询问是否退出当前程序的调试,输入y结束调试

③next和step命令

next和step命令相当于单步调试,使用next或者step命令一次一条执行该段代码。

next和step的区别在于,step遇到函数会跟踪进入函数内部,一次一条的执行该函数,直到函数内的代码执行结束,而next会把函数当作一条语句来执行。

使用step

使用next

④nexti和stepi命令

nexti和stepi命令用来单步执行一条机器指令,注意不是单步执行一行语句。

例如对Sum函数内的for循环来说

for(a; a>2; a-=2)

如果使用nexti或者stepi指令,需要输入多个nexti或者stepi才能执行完

nexti和next类似不会跟踪进入函数内部去执行,而stepi和step类似,会跟踪进入函数内部执行。

6.查看和设置变量的值

①print命令

print命令用来打印变量或表达式的值,也可以用来打印内存中某个变量从开始的一段内存区域的内容,还可以用来对某个变量进行赋值。使用格式为

print 变量或者表达式

print 变量=值

print 表达式@要打印的值的个数n

②whatis 命令

whatis 命令用来显示某个变量或表达式的数据类型,格式如下

whatis 变量或者表达式

③set命令

set命令可以给变量赋值,使用格式为

set variable 变量=值

这里再说一个set命令给主函数设置参数的命令

set args 字符串1 字符串2 字符串3 ......

gdb一些命令可以简写,如list可以用l替代,continue可以用cont替代

④使用gdb调试的时候,gdb只能跟踪一个进程。
可以在fork函数调用之前,通过指令设置gdb调试工具跟踪父进程或子进程。
默认情况下gdb是跟踪父进程。

set follow-fork-mode child 命令设置gdb在fork之后跟踪子进程。

set follow-fork-mode parent设置跟踪父进程。

补充gdb的TUI模式

调试器gdb的更多相关文章

  1. [转] linux下的c/c++调试器gdb

    PS:1. 断点C++类函数,用b 命名空间::类名::方法名 2. 编译参数一定要加-g,才可断点调试 http://www.cnblogs.com/xd502djj/archive/2012/08 ...

  2. linux下的c/c++调试器gdb

    Reference:  http://www.cnblogs.com/xd502djj/archive/2012/08/30/2663960.html linux下的c/c++调试器gdb gdbLi ...

  3. C语言调试器GDB和LLDB的使用方法

    调试器的使用 编译输出带调试信息的程序 调试信息包含:指令地址.对应源代码及行号 指令完成后,回调 LINUX使用GDB MAX使用LLDB 使用说明 // 开始调试testlib程序 lldb te ...

  4. 调试器GDB的基本使用方法

    GDB调试的三种方式: 1. 目标板直接使用GDB进行调试. 2. 目标板使用gdbserver,主机使用xxx-linux-gdb作为客户端. 3. 目标板使用ulimit -c unlimited ...

  5. 使用GDB调试器(一)

    使用GDB调试器 GDB概要---- GDB是GNU开源组织公布的一个强大的UNIX下的程序调试工具.也许,各位比較喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但假设你是在UNIX平台下做软 ...

  6. 使用GDB命令行调试器调试C/C++程序

    原文:http://xmodulo.com/gdb-command-line-debugger.html作者: Adrien Brochard 没有调试器的情况下编写程序时最糟糕的状况是什么?编译时跪 ...

  7. 使用GDB命令行调试器调试C/C++程序【转】

    转自:https://linux.cn/article-4302-1.html 编译自:http://xmodulo.com/gdb-command-line-debugger.html作者: Adr ...

  8. linux基础2——gdb调试器

    gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功 ...

  9. GCC编译器和GDB调试器常用选项

    http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello                 ...

随机推荐

  1. mysql 的安装方式

    一.rpm包安装方式 mysql-community-client-5.7.18-1.el7.x86_64.rpm 客户端 mysql-community-devel-5.7.18-1.el7.x86 ...

  2. Win10自动备份oracle数据库

    1.环境 操作系统:win10 数据库: 2.创建backup.bat文件 [ @echo offset name=%date:~0,4%%date:~5,2%%date:~8,2%set backu ...

  3. Vue&Element开发框架中增加工作流处理,工作流的各个管理页面的界面处理

    我在起前面的几篇随笔中,大概介绍了工作流的一些场景化处理,包括如何把具体业务表单组件化,并在查看和编辑界面中,动态加载组件内容,以及对于查看申请单的主页面,把审批.取消.发起会签.会签.批示分阅.阅办 ...

  4. Flink 实践教程 - 入门(4):读取 MySQL 数据写入到 ES

    ​作者:腾讯云流计算 Oceanus 团队 流计算 Oceanus 简介 流计算 Oceanus 是大数据产品生态体系的实时化分析利器,是基于 Apache Flink 构建的具备一站开发.无缝连接. ...

  5. vue脚手架配置代理

    vue.config.js配置具体代理规则 module.exports = { devServer: { proxy: { '/api1': { // 匹配所有以 '/api1'开头的请求路径 ta ...

  6. docker容器运行java后台程序,存到数据库的时间差一天的问题

    主要原因是docker容器中的时间用的是标准时间,不是用的宿主机的时间. 修改方法: docker run -e TZ="Asia/Shanghai" -d -p 80:80 -- ...

  7. vi/vim 常用命令总结

    目录 Linux vi/vim编辑 vim键盘图 vim的三种模式 命令模式.输入模式.输出模式 vim使用实例 vi/vim按键说明 第一部分:一般模式可用的光标移动.复制粘贴.搜索替换等 第二部分 ...

  8. 用Docker搭建RabbitMq的普通集群和镜像集群

    普通集群:多个节点组成的普通集群,消息随机发送到其中一个节点的队列上,其他节点仅保留元数据,各个节点仅有相同的元数据,即队列结构.消费者消费消息时,会从各个节点拉取消息,如果保存消息的节点故障,则无法 ...

  9. [cf1240F]Football

    (事实上,总是可以让每一场都比,因此$w_{i}$并没有意义) 当$k=2$时,有如下做法-- 新建一个点,向所有奇度数的点连边,并对得到的图求欧拉回路,那么只需要将欧拉回路上的边交替染色,即可保证$ ...

  10. [atARC110E]Shorten ABC

    考虑令$a$.$b$和$c$分别对应1.2和3,那么每一次相当于令$x$和$y$变为$x\oplus y$(要求$x\ne y$) 根据异或的结合律,我们相当于将其划分为若干个区间求异或值 (另外还有 ...