IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux简单gdb使用于调试 -> 正文阅读

[系统运维]Linux简单gdb使用于调试

1.进入与退出

进入:gdb + 可执行程序
退出:quit
在这里插入图片描述

2.Linux下的debug和release:

1.如果一个程序是可以被调试的,该程序的二进制文件一定加入了一些debug信息
2.vs中发布程序的时候,通常有两种发布方案:debug和release
3.release没有包含调试信息
4.centos中,默认形成的可执行程序是release
5.如果想要调试: gcc test.c -o test -g

在这里插入图片描述
从上图中可以看出debug下的test比release占用的空间大一点
此时无论运行上面的debug还是release都没问题

3.开始测试

1.先写一个可调试的程序

在这里插入图片描述
即方便复制调试:

#include<stdio.h>    
    
int SumToTop(int top)    
{    
  int sum = 0;    
  for(int i = 1;i<= top;++i)    
  {    
    sum+=i;    
  }    
  return sum;    
}    
    
int main()    
{    
  int top = 100;    
  int res = SumToTop(top);    
                                                                                                                                                                                                                 
  printf("res = %d\n",res);    
  return 0;    
}    

然后退出编译
在这里插入图片描述
此时我们运行这个test
在这里插入图片描述
如果我们需要这个程序能够调试则需要
-g

2.开始调试

在这里插入图片描述
在这里插入图片描述
注意:有时候调试的时候会出现一些报错,这些报错不会影响调试,所以不需要去管

3.调试指令详解(按照一个程序正常调试步骤进行解释)

我们在自己的常用编译器上输入我们的test.c(我这里用的是vs2019,两者对比能够更好理解)

1. r/run = ctrl+F5(开始执行不调试)

在vs中,最开始按
F10
会进入调试,并进入int main的下一行
继续F10就会逐过程逐语句的进行

在VS中,大多数情况下我们会给代码打断点,然后
F5
就会从断点处开始进行调试

总之我们都需要将代码跑起来,然后调试
在这里插入图片描述

在这里插入图片描述

2. list/l 显示代码

在这里插入图片描述

延伸补充:
这个l一次显示十行代码
l后面加数字会得到这个数字的前五个和后四个的位置所有代码即:
在这里插入图片描述

3.打断点 b

可以根据函数名打,也可以根据行号打(常用)
b+行号
在这里插入图片描述
翻译:
一号断点打在 0X40056a
文件test.c
行号是16

4.查看打的断点 info b

在这里插入图片描述
显示我们打的断点
断点编号,类型, ,enb是否开启,地址,在哪打的断点

5.继续跑 r

在这里插入图片描述

6.逐语句(s/step)或者逐过程(n)

在这里插入图片描述

逐过程:
比如代码中我们写的循环,变量,我调用的函数等等
不会进入这个
而是以分号为结束语句
即:不会进入函数,而是把函数当作一个语句进行调试

逐语句正好相反,所以不做解释

需要注意:
我们进入for循环时,s和n的效果都一样都是逐语句进行(也符合我们的日常操作)

7.监视 display+变量

在这里插入图片描述

display + 变量 (查看具体变量的值)
在这里插入图片描述
display + &变量(查看变量的地址)
在这里插入图片描述
此时我们再s或者n每次显示的时候就会显示这些监视的值

8.只想看一次这个变量的值 P或者p

在这里插入图片描述

9.删除长显示 undisplay+序号 序号 序号

可以一次删除一个监视,或者多个监视
在这里插入图片描述
可以看到我们的监视有序号1 2
所以(删除&sum)
在这里插入图片描述

10.结束当前函数 finish

当我们进入一个函数中的循环时,我们已经发现这个循环是对的,可以用finish进行跳出循环,并直接返回结果,即:
在这里插入图片描述

11.再打断点b + 行号

先用l查看代码,然后b打断点

因为1号断点我们已经运行了一次,所以会出现
breakpoint already hit 1 time

12.跳到下一个断点处 continue/c

下图解释:
先重新跑一次,跑到1号断点处
进入循环
我们发现这个循环没问题,就可以continue进入下一个断点
在这里插入图片描述

13.跳出循环until

方法一:
在10 行处打一个断点,然后continue
方法二:
until
在这里插入图片描述

14.删除断点 d + 断点编号

在这里插入图片描述

15.不删掉断点,但是保存断点 disable+断点编号

在这里插入图片描述

16.打开disable的断点 enable+断点编号

在这里插入图片描述

17.查看各级函数调用及参数 bt/breaktrace

下图解析:
查看函数调用堆栈的信息
在这里插入图片描述

vs vs2019在这里插入图片描述
在这里插入图片描述

18. 改变调试时中的某些变量的值 set var 变量=修改值

在这里插入图片描述

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-02-28 16:03:51  更:2022-02-28 16:06:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:16:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码