GDB常用指令与调试汇总

news2024/11/18 0:49:45

文章目录

  • 前言
  • 一、基础
  • 二、例子
  • 三、用gdb调试多线程程序


前言

GDB(GNU Debugger)是一个强大的调试工具,用于调试C、C++等编程语言的程序。本文将介绍一些常用的GDB指令,以及通过例子演示如何使用这些指令进行程序调试。

一、基础

  1. 启动程序调试:
    使用命令 gdb <executable> 启动GDB,并加载可执行文件进行调试。

  2. 设置断点:

    • 使用命令 break <location>b <location> 设置断点。<location> 可以是函数名、行号或文件名:行号的组合。例如,break mainmain 函数处设置断点。
    • 使用命令 info breakpointsi b 查看已设置的断点信息。
    • 使用命令 delete <breakpoint_number> 删除指定编号的断点。
  3. 运行程序:

    • 使用命令 runr 运行程序,可以在后面跟上命令行参数。
    • 使用命令 continuec 继续执行程序,直到下一个断点或程序结束。
  4. 单步调试:

    • 使用命令 nextn 执行下一行代码,不会进入函数内部。
    • 使用命令 steps 执行下一行代码,并进入函数内部。
  5. 打印变量值:

    • 使用命令 print <expression>p <expression> 打印表达式的值。例如,print x 打印变量 x 的值。
    • 使用命令 info locals 显示当前作用域的局部变量。
  6. 调试信息:

    • 使用命令 backtracebt 显示当前调用栈的信息。
    • 使用命令 info registersi r 查看寄存器的值。
  7. 观察点:

    • 使用命令 watch <expression> 设置观察点,当表达式的值发生变化时中断程序执行。
  8. 退出GDB:

    • 使用命令 quitq 退出GDB。

通过以上常用指令,我们可以对程序进行有效的调试。
在这里插入图片描述

二、例子

下面是一个简单的例子,演示如何使用GDB调试程序:

假设我们有以下C程序,保存为 example.c

#include <stdio.h>

int main() {
    int num1 = 10;
    int num2 = 5;
    int sum = num1 + num2;
    printf("The sum of %d and %d is %d\n", num1, num2, sum);
    return 0;
}

我们希望使用GDB调试这个程序,以查找并解决潜在的问题。

  1. 编译程序时需要添加 -g 参数,以生成可调试的符号表。例如,使用以下命令编译程序:

    gcc -g example.c -o example
    
  2. 启动GDB,并加载可执行文件:

    gdb example
    
  3. 设置断点:

    break main
    

    这将在 main 函数的第一行设置断点。

  4. 运行程序:

    run
    

    程序将运行到第一个断点处停止。

  5. 单步调试:

    使用 next 命令逐行执行代码:

    next
    

    第一次执行 next 后,程序将执行到第二行 int num2 = 5; 处。此时,我们可以使用 print 命令查看变量的值:

    print num1
    

    输出结果为:

    $1 = 10
    

    这表示变量 num1 的值为 10。

    继续执行 next 命令,程序将执行到第三行 int sum = num1 + num2; 处。我们可以使用 step 命令进入 + 操作符对应的函数内部:

    step
    

    程序将进入 + 函数内部。此时,我们可以使用 print 命令查看参数的值:

    print num1
    print num2
    

    输出结果为:

    $2 = 10
    $3 = 5
    

    这表示变量 num1num2 的值分别为 10 和 5。

    继续执行 next 命令,程序将执行到第四行 printf("The sum of %d and %d is %d\n", num1, num2, sum); 处。我们可以使用 print 命令查看变量的值:

    print sum
    

    输出结果为:

    $4 = 15
    

    这表示变量 sum 的值为 15。

  6. 继续执行程序:

    使用 continue 命令继续执行程序:

    continue
    

    程序将执行完毕并退出。

  7. 退出GDB:

    使用 quit 命令退出GDB:

    quit
    

通过以上步骤,我们成功使用GDB调试了这个简单的C程序。在实际的开发中,我们可以使用更多的GDB指令和技巧,以更高效地进行程序调试。

三、用gdb调试多线程程序

对这些GDB命令的整理和示例:

  1. info threads:显示当前可调试的所有线程。每个线程都有一个唯一的ID,被调试的线程前面会有一个"*"标记。

    示例输出:

    (gdb) info threads
    * 1 Thread 0x7ffff7fcf700 (LWP 1234) "program" 0x0000555555555163 in worker_thread ()
      2 Thread 0x7ffff77ce700 (LWP 1235) "program" 0x0000555555555163 in worker_thread ()
    
  2. thread ID:切换到指定ID的线程进行调试。

    示例:

    (gdb) thread 2
    [Switching to thread 2 (Thread 0x7ffff77ce700 (LWP 1235))]
    #0  0x0000555555555163 in worker_thread ()
    
  3. set scheduler-locking [off|on|step]:控制调试时其他线程的执行方式。

    • off:不锁定任何线程,即所有线程都可以继续执行(默认值)。
    • on:只有当前被调试的线程会继续执行。
    • step:在单步执行时,只有当前线程会执行。

    示例:

    (gdb) set scheduler-locking on
    Scheduler locking is on.
    

这些命令可以帮助您在调试多线程程序时进行线程的切换和控制,以及查看当前可调试的线程信息。通过合理使用这些命令,您可以更好地理解和调试多线程程序的执行过程。

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

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

相关文章

java--if语句

1.if语句 根据条件(真或假)来决定执行某段代码。 2.if语句有三种形式 执行流程&#xff1a; 首先判断条件表达式的结果&#xff0c;如果为true执行语句体&#xff0c;为false就不执行语句体。 注意事项&#xff1a; if语句中&#xff0c;如果大括号控制的只有一行代码&am…

【从0到1设计一个网关】网络通信框架Netty的设计

文章目录 Netty架构实现NettyHttpServer实现NettyHttpServerHandler实现NettyProcessor实现NettyHttpClient实现核心容器效果演示注:本文所有代码均已开源在Github上。 源码地址: 项目源码 完成当前章节后,代码效果演示如下: 这个请求将会重定向转发到我们后端的localhost…

woyaojiangzhang

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 博主接触FineReport帆软报表有一段时间了&#xff0c;正好前几天做了一个任务日历的需求&#xff0c;把每天完成的任务量直观的展示在日历上&#xff0c;方便管理者更好的监控各业务的完成情况&#xff0c;做完后想着…

S32K324 UDS Bootloader开发-需求篇

文章目录 前言内存分配UDS诊断协议需求CAN ID及时间参数UDS诊断服务Bootloader诊断服务APP诊断服务 DID22服务的DID:2E服务的DID:Routine Control DID&#xff1a; 刷写流程预编程主编程后编程 总结 前言 之前做过一个STM32的UDS Bootloader&#xff0c;协议栈主要是NXP官网下…

坦克世界WOT知识图谱之知识图谱篇

文章目录 关于Neo4j1. neo4j安装及配置&#xff1a;2. 确定三元组3. 代码实现结束语 关于Neo4j Neo4j是一个高性能的&#xff0c;NOSQL图形数据库。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎&#xff0c;但是它将结构化数据存储在网络(从数学角度叫做…

UG\NX二次开发 设置视图中心 UF_VIEW_set_center

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 a1794902437 订阅本专栏,非常感谢。 简介 UG\NX二次开发 设置视图中心 UF_VIEW_set_center。如果视图NULL_TAG,则使用工作视图。 效果 代码 #include &qu…

【PointNet—论文笔记分享】

第一个直接基于原始点云数据进行分割、分类的模型&#xff0c;之前都是基于多视图或者体素的方式。 论文: PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation代码: TensorFlow版 Pytorch版 基本模型架构&#xff1a; 分别对每个点进行特征提取…

AI大模型基础环境搭建

文章目录 AI大模型基础环境搭建简介下面是搭建大模型基础环境大模型基础环境通常会依赖以下package&#xff1a;conda安装demo环境搭建关于该git项目需要注意的一些点前后端封装 AI大模型基础环境搭建 简介 简单描述一下本文章里会教大家做的东西 1、搭建大模型基础环境 2、f…

JVM相关的面试题

一、什么是程序计数器 二、简要的介绍一下堆 三、什么是虚拟机栈 四、能不能解释下方法区 五、你听过直接内存吗&#xff1f; 六、什么是类加载器&#xff0c;类加载器有哪些 七、什么是双亲委派模型 八、JVM为什么采用双亲委派机制 九、类装载的执行过程 十、对象什么时候被垃…

Day982.各大开放平台是如何使用OAuth 2.0 -OAuth 2.0

各大开放平台是如何使用OAuth 2.0 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于各大开放平台是如何使用OAuth 2.0的内容。 “开放平台”&#xff0c;不难理解&#xff0c;它的作用就是企业把自己的业务能力主要以开放 API 的形式&#xff0c;赋能给外部开发者。而…

C++(Chapter 3)

C(三) 1.引用 1.引用的概念 引用的概念:引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 引用的语法:类型& 引用变量名(对象名) 引用实体 ; 例如: #i…

【OpenGL】七、混合

混合 文章目录 混合混合公式glBlendFunc&#xff08;混合函数&#xff09;glBlendFuncSeparate渲染半透明纹理 参考链接 混合(Blending)通常是实现物体透明度(Transparency)的一种技术 简而言之&#xff1a;混合就是如何将输出颜色和目标缓冲区颜色结合起来。 混合公式 C_fina…

Android 备忘录,记事本程序设计

android备忘录实现&#xff0c;使用ObjectBox数据库框架进行数据存储&#xff0c;增删改查等操作。代码使用kotlin编写。 1、下面看看ObjectBox数据库封装 需要注意的是&#xff1a; /** * 你只有配置好之后, 点击 Make Model 你的model名字, 才会创建 MyObjectBox对象 …

(十七)VBA常用基础知识:读写text文件

读取文件 1.1.数据准备 1.2 代码准备 Sub test()Dim buf As String, n As LongOpen "/Users/sixdog/Documents/VBA/test.txt" For Input As #1Do Until EOF(1)Line Input #1, bufn n 1Sheet1.Range("A" & n) bufLoopClose #1 End Sub1.3 执行结果…

在Unity中如何设置设备的高、中、低配

在开发游戏或应用程序时&#xff0c;考虑到不同设备的性能差异是至关重要的。Unity作为一种流行的游戏开发引擎&#xff0c;提供了一些方法来区分设备的高、中、低配&#xff0c;并相应地调整游戏的性能要求和图形质量。 以下是在Unity中实现这一目标的几种常用方法&#xff1…

【Linux】零基础入门Linux你所需要掌握的

文章目录 目录结构路径描述颜色区分Linux命令文件权限 目录结构 要了解Linux首先,必须要了解linux的目录层级结构,因为在linux中有一切皆文件"的思想. windows系统里面的文件具有各个盘符,如C盘,D盘等 而在Linux中,Linux的目录结构是一个树型结构 Linux没有盘符的概念,只…

程序的编译,链接,执行

目录 1.程序的翻译环境和执行环境 2.翻译环境 3.运行环境 1.程序的翻译环境和执行环境 当我们写出一段代码后&#xff0c;我们需要将代码运行起来。那在这个过程中文件是如何从代码变成可执行程序的呢&#xff1f; 在程序实现过程中中&#xff0c;存在两个环境&#xff1a;一…

Matlab安装必看,手把手教你安装matlab

目录 一 &#xff0c;Matlab介绍 二&#xff0c;安装matlab2021b 一 &#xff0c;Matlab介绍 Matlab是一种高级计算机语言和交互式环境&#xff0c;广泛用于科学、工程、金融和其他领域的数据分析、可视化和数值计算。它是由MathWorks公司开发的&#xff0c;最初发布于1984年…

【unity3D插件】Embedded Browser(ZFBrowser) — 快速实现PC端内嵌网页(有详细图解)

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity3D插件—Embedded Browser 这里写自定义目录标题 下载基础知识基础操作使用公网网址加载一个网页①使用公网网址加载一个网页②使用…

IP子网到底怎么划分【全网最详解】!!!

在学习IP子网划分前&#xff0c;首先的明白以下几个基础概念&#xff1a; 1、IP地址组成 IP地址由32位二进制组成&#xff0c;32位二进制分成了4字节&#xff0c;每字节8位&#xff0c;字节之间用符.&#xff08;点&#xff09;分隔&#xff0c;为了方便人们记忆&#xff0c;经…