调试器gdb
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的更多相关文章
- [转] linux下的c/c++调试器gdb
PS:1. 断点C++类函数,用b 命名空间::类名::方法名 2. 编译参数一定要加-g,才可断点调试 http://www.cnblogs.com/xd502djj/archive/2012/08 ...
- linux下的c/c++调试器gdb
Reference: http://www.cnblogs.com/xd502djj/archive/2012/08/30/2663960.html linux下的c/c++调试器gdb gdbLi ...
- C语言调试器GDB和LLDB的使用方法
调试器的使用 编译输出带调试信息的程序 调试信息包含:指令地址.对应源代码及行号 指令完成后,回调 LINUX使用GDB MAX使用LLDB 使用说明 // 开始调试testlib程序 lldb te ...
- 调试器GDB的基本使用方法
GDB调试的三种方式: 1. 目标板直接使用GDB进行调试. 2. 目标板使用gdbserver,主机使用xxx-linux-gdb作为客户端. 3. 目标板使用ulimit -c unlimited ...
- 使用GDB调试器(一)
使用GDB调试器 GDB概要---- GDB是GNU开源组织公布的一个强大的UNIX下的程序调试工具.也许,各位比較喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但假设你是在UNIX平台下做软 ...
- 使用GDB命令行调试器调试C/C++程序
原文:http://xmodulo.com/gdb-command-line-debugger.html作者: Adrien Brochard 没有调试器的情况下编写程序时最糟糕的状况是什么?编译时跪 ...
- 使用GDB命令行调试器调试C/C++程序【转】
转自:https://linux.cn/article-4302-1.html 编译自:http://xmodulo.com/gdb-command-line-debugger.html作者: Adr ...
- linux基础2——gdb调试器
gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功 ...
- GCC编译器和GDB调试器常用选项
http://blog.csdn.net/u014328976/article/details/46745349 GCC编译器 gcc hello.c -o hello ...
随机推荐
- Java实体映射工具MapStruct使用详解
1.序 通常在后端开发中经常不直接返回实体Entity类,经过处理转换返回前端,前端提交过来的对象也需要经过转换Entity实体才做存储:通常使用的BeanUtils.copyProperties方法 ...
- 某企业桌面虚拟化项目-Citrix虚拟桌面解决方案
xxx桌面虚拟化项目Citrix解决方案 xxx桌面虚拟化项目 Citrix解决方案 1 项目背景 秉承"尊重个性.创造价值.贡献于社会"的企业理念和开拓创新的精神,xxx所制造. ...
- 谷粒 | 11 | nginx windows版简单安装使用
nginx配置 下载安装 传送门:官网下载 官网提供三种版本: Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版 Stable version:最 ...
- EDG夺冠!用Python分析22.3万条数据:粉丝都疯了!
一.EDG夺冠信息 11月6日,在英雄联盟总决赛中,EDG战队以3:2战胜韩国队,获得2021年英雄联盟全球总决赛冠军,这个比赛在全网各大平台也是备受瞩目: 1.微博热搜第一名,截止2021-11-1 ...
- 持续集成、持续交付(CI/CD)开篇,先来唠唠嗑
前言 现在稍微有点规模的系统,很多都是采用分布式/微服务架构,将一个大系统拆分为很多个功能模块进行开发.测试.发布.管理等,如果全部流程都采用人工的形式进行的话,效率肯定是超级不高效滴.而且现在很多项 ...
- Go defer 特性和使用场景
golang 的 defer 语句用于延迟调用.defer 会在当前函数返回之前执行 defer 注册的函数.比如 defer func_defer() 这样语句会让你注册一个函数变量到 defer ...
- .net工程师学习vue的心路历程(一)
实习一年后,想做一个属于自己的博客网站,准备用core api去搭建服务端接口,前端准备采用vue这样的一个框架.本身时一个服务端程序员,所以来学习记录一些vue的知识点,有什么不足的希望大家指正,谢 ...
- [loj3503]滚榜
一个小问题:题意中关于$b_{i}$的顺序只需要单调不降即可,相同时可任意选择 考虑$i$优于$j$的条件,即$val_{i}\ge val_{j}+[i>j]$,并记$del_{i,j}=\m ...
- [noi253]A
定义f[i][j]表示从(i,j)走到最后一行的期望,不断从下往上dp那么对于每一行都可以得到m个方程. 但由于这m个方程不是DAG,因此考虑用高斯消元,但时间复杂度不对. 观察方程可以发现如果不断将 ...
- electron另一种运行方式
编写helloword 全局安装软件 npm install -g electron 快速编写html html:5 完整代码和流程: 1.index.html <!DOCTYPE htm ...