GDB 调试代码

news2024/11/18 13:36:36

目录

一、其他调试代码的工具

二、GDB调试

1、调试准备

2、开始调试

3、调试命令

1.运行程序

2.退出gdb

3.传参

4.查看代码

5.设置或删除断点及相关操作

6.继续运行

7.运行中打印某些值及其类型

8.自动的打印某些值和信息及其相关操作

9.单步调试

10.设置变量的值

未完待续~~~。


一、其他调试代码的工具

1.strace 、lsof工具也可以调试。

二、GDB调试

1、调试准备

        在使用gdb调试之前,我们需要在使用gcc编译的时候加上 -g选项, 如果你没有-g选项,运行的时候可以看到gdb提示你不能调试。同时对于多个文件,你都要加上-g

2、开始调试

        假设我编译好的文件名为test, 使用gdb ./test 开启调试。我的文件树如下图所示:

3、调试命令

1.运行程序

        我们使用(run or r or start)三个命令可以运行程序, r是run命令的缩写,这个命令就像你运行 ./test 可执行文件一样,顺便说一下这个test 与加了 -g选项的test 是不一样的。运行start命令,会使程序停止在 main函数入口。如下图:

我的makefile如下: 

all:test

test.o:test.c
	gcc -g $^ -c -o $@
sestack.o:sestack.c
	gcc -g $^ -c -o $@
test:test.o sestack.o
	gcc  -g $^ -o $@

2.退出gdb

        使用quit or q来退出gdb

3.传参

        有时候,我们需要通过命令行去传参数,可以使用set args 参数1 参数2 参数3 ...来给程序传参数。

4.查看代码

        你只能查看当前文件的代码, 如果需要查看其他文件的代码,则需切换到其他的文件。使用list or l  来查看当前文件的代码,你可以通过set listsize  20 来修改你每次需要显示的行数为20。如下图:

当前我在test

         接下来我们切换到sestack.c,你可以看到我使用了list   、 list 行号、 list 函数名、 list  文件名:行号。

5.设置或删除断点及相关操作

        有两种断点,一种是常规断点,一种是条件断点。使用break 行号or b 行号 来设置断点。

或者是使用他们在一个函数处设置断点。

        常规断点的使用,如下图所示:

         条件断点的使用如下图所示:

         

        在设置完断点后我们可以通过info b 或者 i b来查看断点的信息。

         我们可以通过delete or del or d  + 断点的编号来删除断点。或者d num1-num4

         我们还可以通过disable(dis) 或者 enable(ena) 来设置断点的有效和无效。(观察Enb这一行)

6.继续运行

        使用continue or c来继续的向下运行。

7.运行中打印某些值及其类型

        使用print or p 来打印我们想打印的值。同时我们还可以设置我们打印时的输出格式。如下表所示:

         我们可以使用ptype 来打印某个变量的类型。

8.自动的打印某些值和信息及其相关操作

        我们使用display可以来展示我们经常需要打印的值。我们也可以通过info display来展示我们需要自动打印的信息。

 我们可以通过undisplay  编号  或者delete display 编号来删除, 当然这里可以展示不打印使用disable 不打印, 使用enable 来打印:

 

9.单步调试

        我们可以用step or s来进行单步调试(s可以进入到函数体的内部),值得注意的时当我们使用单步调试进入一个函数的时候,我们必须使用finish 来跳出函数。

如果通过 s 单步调试进入到函数内部,想要跳出这个函数体, 可以执行 finish 命令。如果想要跳出函数体必须要保证函数体内不能有有效断点,否则无法跳出(待实践)。

          我们也可以使用next or n来向下运行,但是next不会进入函数体内。

        如果我们想跳出某个循环体 ,我们可以使用until ,但是要满足一下的条件:

  • 要跳出的循环体内部不能有有效的断点
  • 必须要在循环体的开始 / 结束行执行该命令

10.设置变量的值

        有时候我们需要设置某个变量的值,来查看程序的行为。我们可以使用set val 变量名=值来设置某个变量的值。

 可以看到我把s指针设置为null后报错了。

未完待续~~~。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/756556.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

http-server 的安装与使用

文章目录 问题背景http-server简介安装nodejs安装http-server开启http服务http-server参数 问题背景 打开一个文档默认使用file协议打开,不能发送ajax请求,只能使用http协议才能请求资源,所以此时我们需要在本地建立一个http服务&#xff0c…

基于java的智能停车场管理系统

背景 智能停车场管理系统的主要使用者分为管理员和用户,实现功能包括管理员:个人中心、用户管理、车位信息管理、车位租用管理、车位退租管理、违规举报管理、论坛交流、系统管理,用户:个人中心、车位租用管理、车位退租管理、违…

MySQL每日一练——MySQL多表查询进阶挑战

目录 1、首先创建表 t_dept: t_emp: 2、插入数据 t_dept表: t_tmp表: 3、修改表 4、按条件查找 1、首先创建表 t_dept: CREATE TABLE t_dept (id INT(11) NOT NULL AUTO_INCREMENT,deptName VARCHAR(30) DEFAULT NULL,address VARCHAR(40) DEFAULT NULL,P…

为什么单片机可以直接烧录程序的原因是什么?

单片机(Microcontroller)可以直接烧录程序的原因主要有以下几点: 集成性:单片机是一种高度集成的芯片,内部包含了处理器核心(CPU)、存储器(如闪存、EEPROM、RAM等)、输入…

JavaScript 使用URL跳转传递数组对象数据类型的方法

文章目录 首先了解一下正常传递基本数据类型JavaScript 跳转页面方法JavaScript 路由传递参数JavaScript 路由接收参数传递对象、数组效果: 在前端有的时候会需要用链接进行传递参数,基本数据类型的传递还是比较简单的,但是如果要传递引用数据…

AWS 解决方案架构师「免费考」

周五晚,AWS 推出了的训练营活动,这对于正在准备 Cloud Practitioner 的我来说,简直不要太开心。官方文章原文链接《限定!直冲「云」霄训练营开营啦》。 PART-01 训练营简介 看到推送后第一时间点了进去,活动的情况简…

Socket API使用——模拟http协议

Socket API使用——模拟http协议 简单的c/s程序——服务端实例 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.nio.char…

Python np.unique()函数详解

np.unique()函数详解:返回数组的唯一值唯一值默认已进行从小到大的排序 一些重要参数 return_index:bool, optional。如果设置为True,返回数组中唯一值的索引号;否则不返回。 注意:返回的数组和输入的数组的大小不相同&#xf…

第十五章——友元、异常

友元 类并非只能拥有友元函数,也可以将类作为友元。在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员。因此尽管友元被授予从外部访问类的私有部分的权限,但它们并不与面向对象的编程思想相悖,相反提高了共有…

《C++程序设计原理与实践》笔记 第20章 容器和迭代器

本章和下一章将介绍STL,即C标准库的容器和算法部分。关键概念序列和迭代器用于将容器(数据)和算法(处理)联系在一起。 20.1 存储和处理数据 首先考虑一个简单的例子:Jack和Jill各自在测量车速&#xff0c…

echarts x轴文字过长 文字换行显示

xAxis: {type: "category",data: [四美休闲娱乐文化场馆, 资讯, 大咖分享],axisLabel: {show: true,fontSize: 10,interval: 0,color: "#CAE8EA",formatter: function (params) {var newParamsName "";var paramsNameNumber params.length;var…

MySQL数据库基础 18

第18章_MySQL8其它新特性 1. MySQL8新特性概述1.1 MySQL8.0 新增特性1.2 MySQL8.0移除的旧特性 2. 新特性1:窗口函数2.1 使用窗口函数前后对比2.2 窗口函数分类2.3 语法结构2.4 分类讲解1. 序号函数2. 分布函数3. 前后函数4. 首尾函数5. 其他函数 2.5 小 结 3. 新特…

【讲座笔记】Continual Learning and Memory Augmentation with Deep Neural Networks

20230607【开放世界的感知:探索可迁移与可持续学习之路】巩东:Continual Learning and Memory Augmentation……_哔哩哔哩_bilibili 游荡……游荡……找个talk看一下 讲的是continuous learning(好家伙缩写也是CL) 1.continual l…

error: ‘CV_LOAD_IMAGE_UNCHANGED’ was not declared in this scope

1-错误 2-错误原因 opencv4.x以上,有些宏,API名字改了,需要改为新的 3-解决方案 CV_LOAD_IMAGE_UNCHANGED 改为 cv::IMREAD_UNCHANGEDCV_LOAD_IMAGE_GRAYSCALE 改为 cv::IMREAD_GRAYSCALECV_LOAD_IMAGE_COLOR 改为 cv::IMREAD_COLORCV_LO…

Win10,WinServer16,DNS,Web ,域 环境配置 周总结 (温故而知新 可以为师矣 第十五课)

Win10,WinServer16,DNS,Web ,域 环境安装 (第十五课) 创建虚拟机安装windowserver2016服务器(NETBASE第二课)_星辰镜的博客-CSDN博客 创建台虚拟机并安装上window10系统(NETBASE 第一课)_window 虚拟机_星辰镜的博客-CSDN博客配置通过域名访问网站(NET…

【5G PHY】5G 调制与编码策略(MCS)介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

实验:如何在YOLO8中添加PnP算法来实现Head Pose Estimation

目录 前言一、步骤二、PnP估计Head Pose,并显示1.引入库2.结果展示 总结 前言 YOLO8的集成度比较高,如何在简洁的代码中加入Head Pose的东西,不是一件简单的事情.这里介绍如何插入PnP算法实现头部姿态估计的代码&…

【岛屿最大面积】BJ某IT厂笔试题

该题在LeetCode上能找到原题,大致意思是,给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&…

【雕爷学编程】Arduino动手做(06)---KY-038声音传感器模块2

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的&am…

【PDFBox】PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐

这篇文章,主要介绍PDFBox操作PDF文档之添加本地图片、添加网络图片、图片宽高自适应、图片水平垂直居中对齐。 目录 一、PDFBox操作图片 1.1、添加本地图片 (1)案例代码 (2)运行效果 (3)方…