GDB调试基础知识

news2024/11/27 20:58:40

文章目录

  • 概念
  • 准备工作
  • 常用命令
    • 说明
    • 启动与退出
    • 给程序设置参数/获取设置参数
    • GDB使用帮助
    • 查看当前文件代码
    • 查看非当前文件代码
    • 查看及设置显示的行数
    • 断点操作
    • 调试操作

概念

  • GDB 是由 GNU 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多类 Unix 系统中的标准开发环境。
  • 一般来说,GDB 主要帮助你完成下面四个方面的功能:
    • 启动程序,可以按照自定义的要求随心所欲的运行程序。
    • 可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式)。
    • 当程序被停住时,可以检查此时程序中所发生的事。
    • 可以改变程序,将一个 BUG 产生的影响修正从而测试其他 BUG。

准备工作

  • 使用以下命令编译:gcc -g -Wall program.c -o program

    • 通常,在为调试而编译时,我们会关掉编译器的优化选项-O), 并打开调试选项-g)(只有这样在编译时才会将代码信息加入可执行程序中,并不是将代码放到编译文件,而是当需要时会从原来路径里找代码,如果删除则找不到)。另外,-Wall在尽量不影响程序行为的情况下选项打开所有warning,也可以发现许多问题,避免一些不必要的 BUG
    • -g 选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证 gdb 能找到源文件
  • 注:当在 gdb 中直接使用回车时,会默认执行上一条命令

常用命令

说明

  • 启动与退出查看当前文件代码使用test.c
  • 后续内容使用课件中其他源程序

启动与退出

  • 启动:gdb 可执行程序
  • 退出:quit/q
    在这里插入图片描述

给程序设置参数/获取设置参数

  • 设置参数:set args 10 20
  • 获取设置参数:show args
// test.c 源码
#include <stdio.h>
#include <stdlib.h>

int test(int a);

int main(int argc, char* argv[]) {
    int a, b;
    printf("argc = %d\n", argc);

    if(argc < 3) {
        a = 10;
        b = 30;
    } else {
        a = atoi(argv[1]);
        b = atoi(argv[2]);
    }
    printf("a = %d, b = %d\n", a, b);
    printf("a + b = %d\n", a + b);

    for(int i = 0; i < a; ++i) {
        printf("i = %d\n", i);
        // 函数调用
        int res = test(i);
        printf("res value: %d\n", res);
    }

    printf("THE END !!!\n");
    return 0;
}

int test(int a) {
    int num = 0;
    for(int i = 0; i < a; ++i) {
        num += i;
    }
    return num;
}

在这里插入图片描述

GDB使用帮助

  • help

在这里插入图片描述

vim 查看代码设置代码行数可以使用:

:set nu

查看当前文件代码

  • 从默认位置显示:list/l,源代码文件不能删除或移动,如果啥都不输入按回车默认运行上次命令。

在这里插入图片描述

  • 从指定的行显示:list/l 行号,并不是从该行显示,而是显示该行的上下文信息。

在这里插入图片描述

  • 从指定的函数显示:list/l 行号,同样显示上下文信息。

在这里插入图片描述

  • 多文件编译时list会显示主函数的代码,此时如果想看其余文件的代码可通过:

    g++ bubble.cpp main.cpp select.cpp -o main -g
    
    gdb main
    
    list
    
    list bubble.cpp 1(1表示行)
    
    l select.cpp:10
    
    或者通过文件名加函数的形式
    l select.cpp:selectSort
    
  • 注:查看时会显示前后文

查看非当前文件代码

  • 编译运行并使用gdb main

在这里插入图片描述

  • 从指定文件指定的行显示:list/l 文件名:行号

在这里插入图片描述

  • 从指定文件指定的函数显示:list/l 文件名:函数名

在这里插入图片描述

查看及设置显示的行数

  • 查看显示的行数:show list/listsize
  • 设置显示的行数:set list/listsize

在这里插入图片描述

断点操作

  • 查看断点:i/info b/break

  • 设置一般断点

    • b/break 行号
    • b/break 函数名
    • b/break 文件名:行号
    • b/break 文件名:函数
  • 设置条件断点(一般用在循环的位置):b/break 10 if i==5

在这里插入图片描述

  • 删除断点:d/del/delete 断点编号
  • 设置断点无效:dis/disable 断点编号
  • 设置断点生效:ena/enable 断点编号

在这里插入图片描述

调试操作

  • 运行 GDB 程序
    • 程序停在第一行:start
    • 遇到断点才停:run
  • 继续运行,到下一个断点停:c/continue
  • 向下执行一行代码(不会进入函数体):n/next
  • 变量操作
    • 打印变量值:p/print 变量名
    • 打印变量类型:ptype 变量名
  • 向下单步调试(遇到函数进入函数体)
    • s/step
    • 跳出函数体:finish
  • 自动变量操作
    • 自动打印指定变量的值:display 变量名
    • 查看自动变量:i/info display
    • 取消自动变量:undisplay 编号
  • 其它操作
    • 设置变量值:set var 变量名=变量值 (循环中用的较多)
    • 跳出循环:until,循环里面不能有断点

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

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

相关文章

Python基础教程——60个基础练习(三)

41-字符串格式化 "%s is %s years old" % (bob, 23) # 常用 "%s is %d years old" % (bob, 23) # 常用 "%s is %d years old" % (bob, 23.5) # %d 是整数 常用 "%s is %f years old" % (bob, 23.5) "%s is %5.2f…

ListBox基本用法

作用&#xff1a;列表框&#xff0c;用于以列表的形式展示数据。 常用属性&#xff1a; 允许多列显示数据 添加数据项集合 常用事件&#xff1a; 选择项变化时触发该事件 后台代码示范&#xff1a; //列表框项目选择变化时被触发private void listBox1_SelectedIndexChanged…

Flutter 跳转应用市场评分——超简洁实现

最近在做flutter跳转去应用市场评分的功能&#xff0c;虽然是一个很小的功能&#xff0c;但是要做的既简单又高效&#xff0c;同时又能把细节考虑到&#xff0c;还是有坑要走的&#xff0c;这边记录一下。 背景 做应用市场相关的运营&#xff0c;在app内增加评分引导&#xf…

经典目标检测R-CNN系列(1)开山之作R-CNN

经典目标检测R-CNN系列(1)开山之作R-CNN 2014年&#xff0c;大神RBG&#xff08;Ross Girshick&#xff09;等人将卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;应用于目标检测任务中&#xff0c;在PASCAL VOC 2012数据集上&#xff0c;能…

vue 如何发布并部署到服务器

一般情况npm run build即可 从而生成vue代码直接放到服务器即可 这里的具体情况要看package.json里面的配置从而使用命令 会生成dist就是该项目的发布包

软件测试项目经验重要吗?

目前从行业薪资排名看&#xff0c;IT行业是我们普通人能够接触到的高薪行业&#xff0c;像金融、银行和投行等高薪职位&#xff0c;张雪峰老师在他的视频中分析过&#xff0c;不是一般人可以拿捏的。IT行业的大部分岗位需要专业的技能&#xff0c;留给我们这些非计算机专业科班…

实现微信机器人开发,个微api

首先微信聊天机器人&#xff0c;是一种通过自然语言模拟人类进行对话的程序。通常运行在特定的软件平台上&#xff0c;如PC平台或者移动终端设备平台。 有兴趣的可以去进行测试&#xff08;E云管家&#xff09;&#xff0c;功能十分全面 文档测试过程中实现多项功能进行管理 …

数据结构--线性表的链式存储结构

这里写目录标题 链式存储结构链表简介格式分类头结点位置示意图与不带头结点的区别 链表的特点 单链表定义链表的代码实现简介实操 基本操作的实现初始化单链表销毁单链表清空单链表求单链表表长 二级目录二级目录二级目录二级目录二级目录二级目录 链式存储结构 链表 简介 格…

QML学习day1

QML学习day1 main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.5Window {width: 640height: 480visible: truecolor:"blue"title: qsTr("Hello World")Button {//按钮id: btn1width: 50height: 50focus: true //聚焦…

P106-100组A卡(R5 240)指南

P106-100组A卡&#xff08;R5 240&#xff09;指南 不建议小白尝试 不建议小白尝试 不建议小白尝试文章目录 P106-100组A卡&#xff08;R5 240&#xff09;指南资料合集硬件软件基础卸载所有原驱动安装驱动修改注册表自动调用——只改一个注册表手动调用——改两个注册表 劝退…

软件设计原则

在软件开发中&#xff0c;为了提高软件系统的可维护性和可复用性&#xff0c;增加软件的可扩展性和灵活性&#xff0c;程序员要尽量根据6条原则来开发程序&#xff0c;从而提高软件开发效率、节约软件开发成本和维护成本。 开闭原则 对扩展开放&#xff0c;对修改关闭。在程序…

Leecode402:移掉 K 位数字

这道题一看想的是可能用回溯或者什么别的方法&#xff0c;但是那样的话时间复杂度非常高&#xff0c;而且也不适用于动态规划&#xff0c;所以观察的话&#xff0c;可以知道从前往后判断的话肯定是前面越小越好&#xff0c;所以只需要前面最小&#xff0c;整体就最小。因此从前…

子网掩码详解

1 子网掩码 IP地址是以网络号和主机号来标示网络上的主机的&#xff0c;我们把网络号相同的主机称之为本地网络&#xff0c;网络号不相同的主机称之为远程网络主机&#xff0c;本地网络中的主机可以直接相互通信&#xff1b;远程网络中的主机要相互通信必须通过本地网关&#…

酸蚀刻对钛医药材料纳米形态表面特性及活化能的影响

引言 由于商业纯钛(CP Ti)具有抗腐蚀性&#xff0c;并且具有哦合适的机械性能以及生物相容性&#xff0c;因此&#xff0c;目前一直被用作牙科植入材料。为了在临床手术中获得高水平的成功&#xff0c;CP Ti的表面质量和形貌是影响植入手术结果的最关键因素之一&#xff0c;近…

GPT使用技巧

五大原则 想要让ChatGPT产出有效的回答&#xff0c;需要遵循以下五个原则&#xff1a; 提问清晰&#xff1a; 请尽可能清晰地描述您的问题 简明扼要&#xff1a; 请尽量使用简单的语言和简洁的句子来表达您的问题 确认问题&#xff1a; 请确认您的问题是清晰、明确和完整…

python接口自动化--token登录(详解)

简介 为了验证用户登录情况以及减轻服务器的压力&#xff0c;减少频繁的查询数据库&#xff0c;使服务器更加健壮。有些登录不是用 cookie 来验证的&#xff0c;是用 token 参数来判断是否登录。token 传参有两种一种是放在请求头里&#xff0c;本质上是跟 cookie 是一样的&…

攻不下dfs不参加比赛(十一)

标题 为什么练dfs题目为什么练dfs 相信学过数据结构的朋友都知道dfs(深度优先搜索)是里面相当重要的一种搜索算法,可能直接说大家感受不到有条件的大家可以去看看一些算法比赛。这些比赛中每一届或多或少都会牵扯到dfs,可能提到dfs大家都知道但是我们为了避免眼高手低有的东…

手把手教会你使用Markdown

目录 一、Markdown是什么 二、Markdown优点 三、Markdown的基本语法 一、Markdown是什么 Markdown 是一种轻量级标记语言&#xff0c;创始人为约翰格鲁伯&#xff08;John Gruber&#xff09;。 Markdown 允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成…

四川大学计算机考研分析

关注我们的微信公众号 姚哥计算机考研 更多详情欢迎咨询 四川大学&#xff08;B&#xff09;考研难度&#xff08;☆☆☆☆&#xff09; 四川大学计算机考研招生学院是计算机学院、网络空间安全学院和视觉合成图形图像技术国防重点学科实验室。目前均已出拟录取名单。 四川…

【Linux】多线程(三)

文章目录 线程池线程安全的单例模式什么是单例模式什么是设计模式单例模式的特点饿汉实现方式和懒汉实现方式饿汉方式实现单例模式懒汉方式实现单例模式懒汉方式实现单例模式(线程安全版本) STL,智能指针和线程安全STL中的容器是否是线程安全的?智能指针是否是线程安全的? 其…