当前位置: 首页 > news >正文

Linux的调试器--gbd/cgbd

1.引入

#include <stdio.h>
int Sum(int s, int e)
{int result = 0;for(int i = s; i <= e; i++){result += i;}return result;
}
int main()
{int start = 1;int end = 100;printf("I will begin\n");int n = Sum(start, end);printf("running done, result is: [%d-%d]=%d\n", start, end, n);return 0;
}
程序的发布⽅式有两种, debug 模式和 release 模式, Linux gcc/g++ 出来的⼆进制程
序,默认是 release 模式。这一点在我们window下比较直观。
要使⽤gdb调试,必须在源代码⽣成⼆进制程序的时候, 加上 -g 选项,如果没有添加,程序⽆法被
编译。
在创建好两种格式后我们可以看到他们的内存是不一样的。

2.gbd/cgbd的使用

一般情况下,我们更建议使用cgbd,因为cgbd会显示源代码
开始: gdb binFile
退出: ctrl + d quit 调试命令
命令作用样例
list/l显示源代码,从上次位置开始,每次列出 10 行list/l 10
list/l 函数名列出指定函数的源代码list/l main
list/l 文件名:行号列出指定文件的源代码list/l mycmd.c:1
r/run从程序开始连续执行run
n/next单步执行,不进入函数内部next
s/step单步执行,进入函数内部step
break/b [文件名:] 行号在指定行号设置断点break 10
break test.c:10
break/b 函数名在函数开头设置断点break main
info break/b查看当前所有断点的信息info break
finish执行到当前函数返回,然后停止finish
print/p 表达式打印表达式的值print start+end
p 变量打印指定变量的值p x
set var 变量 = 值修改变量的值set var i=10
continue/c从当前位置开始连续执行程序continue
delete/d breakpoints删除所有断点delete breakpoints
delete/d breakpoints n删除序号为 n 的断点delete breakpoints 1/d 1
disable breakpoints禁用所有断点disable breakpoints
enable breakpoints启用所有断点enable breakpoints
info/i breakpoints查看当前设置的断点列表info breakpoints
display 变量名跟踪显示指定变量的值(每次停止时)display x
undisplay 编号取消对指定编号的变量的跟踪显示undisplay 1
until x 行号执行到指定行号until 20
backtrace/bt查看当前执行栈的各级函数调用及参数backtrace
info/i locals查看当前栈帧的局部变量值info locals
quit退出 GDB 调试器quit
对于一些常用的指令我们解释一下:

(1)

r/run从程序开始连续执行run

细节1:gdb启动调试的时候,只是开启了gdb,被调试程序,并没有运行起来。

细节2:r/run,表示的是在gdb的场景中,启动我们自己的mycmd程序

细节3:在没有断点的情况下,r/run,就是 让我们的程序直接运行结束

细节4:断点的本质功能:让我们的程序,在运行到指定的行,进行暂停!

(2)

n/next单步执行,不进入函数内部next
s/step单步执行,进入函数内部step

 这两条指令就相当于vs里的F10和F11。

(3)

continue/c从当前位置开始连续执行程序continue

运行到结束或者下一个节点处

(4)

disable breakpoints禁用所有断点disable breakpoints
enable breakpoints启用所有断点enable breakpoints

为什么不删除?因为要保留调试痕迹

3. 调试技巧

3.1watch

执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB 会暂停程序的执⾏,并通知使⽤者。
如果你有⼀些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如果变
化了,就会通知你。
watch的查看和删除类似于断点,info查看,d删除。

3.2set var确定问题原因

在我们的测试案例中,
更改⼀下标志位,假设我们想得到 +-result
#include <stdio.h>
int flag = 0; // 故意错误
//int flag = -1;
//int flag = 1;
int Sum(int s, int e)
{
int result = 0;
for(int i = s; i <= e; i++)
{
result += i;
}
return result*flag;
}
int main()
{
int start = 1;
int end = 100;
printf("I will begin\n");
int n = Sum(start, end);
printf("running done, result is: [%d-%d]=%d\n", start, end, n);
return 0;
}

运行出来结果为0,但在调试的时候用set var flag=1改变flag的话就是5050。

3.3条件断点

使用方法:

b 行号 条件

eg. b 9 if i == 30 # 9是⾏号,表⽰新增断点的位置。

在原有的断点基础上:

condition 编号 条件

条件断点添加常⻅两种⽅式:1. 新增 2. 给已有断点追加
注意两者的语法有区别,不要写错了。
新增: b ⾏号/⽂件名:⾏号/函数名 if i == 30(条件)
给已有断点追加:condition 2 i==30, 其中2是已有断点编号,没有if

相关文章:

  • 数据清理的例子
  • 【计算机网络】传输层TCP协议——协议段格式、三次握手四次挥手、超时重传、滑动窗口、流量控制、
  • 【Golang进阶】第八章:并发编程基础——从Goroutine调度到Channel通信实战
  • CentOS 7 环境下部署 LAMP
  • Go语言通道如何实现通信
  • 计算机网络 HTTP篇常见面试题总结
  • Vert.x学习笔记-EventLoop工作原理
  • 使用ssh-audit扫描ssh过期加密算法配置
  • day14 leetcode-hot100-27(链表6)
  • Telerik生态整合:Kendo UI for Angular组件在WinForms应用中的深度嵌入(一)
  • Edmonds-Karp详解-基于BFS的最短增广路径
  • 【仿生机器人】仿生机器人认知-情感系统架构设计报告
  • 抽奖系统抽奖活动管理流程
  • 基于 KubeKey 3.1.9,快速部署 K8s 1.33.0 高可用集群
  • quasar electron mode如何打包无边框桌面应用程序
  • 代码随想录算法训练营 Day60 图论Ⅹ Bellmen_ford 系列算法
  • 由反汇编代码确定结构体的完整声明
  • 精通 Kubernetes:从故障排除到化繁为简
  • Eclipse集成lombok
  • 数据结构之队列:原理与应用
  • 前几年做啥网站致富/余姚网站如何进行优化
  • 有哪些做包装设计网站好些/合肥seo网站建设
  • 网站建设合同任/免费手机优化大师下载安装
  • 做翻译 网站吗/线上宣传渠道有哪些
  • 余姚做网站设计的公司/国内专业seo公司
  • 自己做的音乐网站侵权问题/怎么推广软件让别人下载