Linux 使用gdb调试C程序

一、gdb的一些基础命令

l:显示代码
l n:跳转到当前代码页的第n行的代码
l filename.c :n:跳转到filename.c文件的第n行代码
b 行号:加断点
info break:查看断点信息
delete 断点编号:删除断点
r,运行程序
n,单步执行
c,继续执行,遇到断点停止执行
p,打印
s,进入函数
finish,退出函数
q,退出gdb

二、调试示例

先写一个main.c程序,该程序用来循环输出从键盘输入的字符串,直到遇到"end"结束循环:

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

编译并运行main.c:

在这里插入图片描述

发现和我们的预期并不一样,在输入"end"之后并没有结束循环,通过Ctrl+c结束这个进程。

  1. 进入gdb,gdb去调试Release版本:

在这里插入图片描述

从上图可以看出目前并不可以进行调试,之所以能打出一些信息,是因为这些信息是gdb打印出来的,而main程序还没有执行,下面的这句话
在这里插入图片描述
告诉我们在main程序中没有找到合适的符号,也就是没有包含调试信息,所以这个时候是调试不了的。在输入l进行显示代码时,下面这句话
在这里插入图片描述
告诉我们没有调试的符号表示被导入。说明这时的main程序是有问题的,没有包含调试信息。输入q退出gdb。

  1. gdb去调试Debug版本:

(1)编译和跟踪

按照gcc -o main main.c -g去编译main.c生成可执行程序main,并用gdb去跟踪main程序:

在这里插入图片描述
这时我们可以通过在这里插入图片描述
这句话看出gdb从main中读到了符号表。

(2)显示所编写的代码

通过gdb指令l显示代码

在这里插入图片描述

一次只能显示10行代码。

(3)设置断点

语法形式:break 行号,break可以简写为b

将断点加到第13行:

在这里插入图片描述

可以继续下断点:

在这里插入图片描述

查看加了哪些断点info break

在这里插入图片描述

删除断点delete Num

删除第2个断点:

在这里插入图片描述

(4)运行程序进行调试

输入run,可以简写为r,按回车:

在这里插入图片描述

当前程序执行到了13行停止。

输入n,让程序单步执行:

在这里插入图片描述

从上图可以看出输入了字符串"hello",然后程序运行到了17行的if语句。

这时,我们输入p buff来查看一些buff中的内容:

在这里插入图片描述

可以看到,当前buff中存放的是字符串"hello\n"。

继续输入n单步执行:

在这里插入图片描述

当前程序又执行到了13行。

我们继续单步执行,这次输入字符串"end",程序跳转到17行的if语句:

在这里插入图片描述

此时,我们再输入p buff来查看一些buff中的内容:

在这里插入图片描述

可以看到,当前buff中存放的是字符串"end\n",这和我们输入的字符串"end"并不相同。

因此,再继续执行时,程序依然会进入循环:

在这里插入图片描述

此时,我们就通过调试发现了代码中存在的问题。

  1. 退出gdb

输入q退出gdb,此时会提示如果要退出会杀死刚刚的main程序,是否要退出,输入y表示退出,按回车就退出gdb。
在这里插入图片描述

退出gdb之后,刚刚的main程序也就结束了:

在这里插入图片描述

  1. 通过调试结果修正代码

将strcmp()改为strncmp():

在这里插入图片描述

此时,我们再去编译main.c,执行main程序,结果如下:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware 16 Pro将电脑里的文件移动到虚拟机中【附带可能出现的问题和解决】

VMware 16 Pro将电脑里的文件移动到虚拟机中 1.使用VM tools 打开VM ware会出现下面的,直接点击安装。 点击下一步 选哪个都行 之后会重启虚拟机,然后就可以使用了。 我没有程序可以打开压缩包,显示我的虚拟机网络没法用,点击…

实时时钟+闹钟

在江科大实时时钟的基础上添加闹钟的配置,参考http://t.csdn.cn/YDlYy。 实现功能 :每隔time秒蜂鸣器响一次、设置闹钟的年月日时分秒,到时间蜂鸣器响。 前三个函数没有变,添加 void RTC_AlarmInit(void) 闹钟的中断配置void…

[保研/考研机试] KY187 二进制数 北京邮电大学复试上机题 C++实现

描述 大家都知道,数据在计算机里中存储是以二进制的形式存储的。 有一天,小明学了C语言之后,他想知道一个类型为unsigned int 类型的数字,存储在计算机中的二进制串是什么样子的。 你能帮帮小明吗?并且,小…

Redis学习笔记Day01-Redis入门

声明:本博客部分内容是从终极SpringBoot讲义摘抄的,文字是OCR识别出来的,有可能存在识别错误的可能,如有错误,请大胆指正,我马上修改! 目录 0.官方参考手册API1.连接命令2.key相关命令3.String命…

yolov5目标检测多线程Qt界面

上一篇文章&#xff1a;yolov5目标检测多线程C部署 V1 基本功能实现 mainwindow.h #pragma once#include <iostream>#include <QMainWindow> #include <QFileDialog> #include <QThread>#include <opencv2/opencv.hpp>#include "yolov5.…

前后端分离------后端创建笔记(02)

本文章转载于【SpringBootVue】全网最简单但实用的前后端分离项目实战笔记 - 前端_大菜007的博客-CSDN博客 仅用于学习和讨论&#xff0c;如有侵权请联系 源码&#xff1a;https://gitee.com/green_vegetables/x-admin-project.git 素材&#xff1a;https://pan.baidu.com/s/…

银河麒麟安装php7.1.33

银河麒麟V10兼容CentOS 8 安装过程与CentOS类似。 TencentOS3.1安装PHPNginxredis测试系统_乐大师的博客-CSDN博客 可以参考之前我写的文章。 不过有2个细节不同&#xff0c;下面说下。 问题1&#xff1a;编译错误提示“error:off_t undefined” 解决方法&#xff1a; 编…

LeetCode 1572. 矩阵对角线元素的和

【LetMeFly】1572.矩阵对角线元素的和 力扣题目链接&#xff1a;https://leetcode.cn/problems/matrix-diagonal-sum/ 给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&…

中介者模式(C++)

定义 用一个中介对象来封装(封装变化)一系列的对象交互。中介者使各对象不需要显式的相互引用(编译时依赖->运行时依赖)&#xff0c;从而使其耦合松散(管理变化)&#xff0c;而且可以独立地改变它们之间的交互。 应用场景 在软件构建过程中&#xff0c;经常会出现多个对象…

SpringBoot MDC全局链路解决方案

需求 在访问量较大的分布式系统中&#xff0c;时时刻刻在打印着巨量的日志&#xff0c;当我们需要排查问题时&#xff0c;需要从巨量的日志信息中找到本次排查内容的日志是相对复杂的&#xff0c;那么&#xff0c;如何才能使日志看起来逻辑清晰呢&#xff1f;如果每一次请求都…

Centos7.6 安装mysql过程全记录

在centos 7.6上 离线安装mysql 的步骤&#xff0c;可参考下文&#xff1a; 一、查看当前MySQL的安装情况并卸载 1. 查看当前MySQL的安装情况 查找之前是否安装了MySQL rpm -qa|grep -i mysql 2.卸载mysql 如果已经安装mysql&#xff0c;则需要先停止MySQL&#xff0c;再删除…

Fiddler

基础 Fiddler 相当于一个 “代理”,浏览器访问浏览器页面时&#xff0c;就会把HTTP请求先发给Fiddler&#xff0c;Fiddler 再把请求转发给浏览器的服务器&#xff0c;当浏览器服务器返回数据时&#xff0c;Fiddler拿到返回数据&#xff0c;再把数据交给浏览器。 主界面 删除…