GDB常用指令与调试汇总

文章目录

  • 前言
  • 一、基础
  • 二、例子
  • 三、用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.mzph.cn/news/117092.shtml

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

相关文章

【Web】| CSS Float (浮动)的使用方法

Float&#xff08;浮动&#xff09;概念 CSS的Float&#xff08;浮动&#xff09;&#xff0c;会使得元素向左或者向右移动&#xff0c;其它周围元素也会重新排列。 Float浮动&#xff0c;往往是用于图像&#xff0c;但它的布局一样非常有效。 元素如何浮动 元素的水平方向…

小白必看,手把手教你安装Python

目录 一&#xff0c;Python介绍 二&#xff0c;安装 Python 三&#xff0c;各种疑难杂症&#xff1a; 一&#xff0c;Python介绍 Python 是这两年来比较流行的一门编程语言&#xff0c;主要卖点是其相对简单的语法以及丰富的第三方库&#xff0c;下面我来带大家安装、配置 P…

python免杀初探

文章目录 loader基础知识loader参数介绍 evilhiding项目地址免杀方式修改加载器花指令混淆loader源码修改签名加壳远程条件触发修改ico的md5加密 loader基础知识 loader import ctypes #&#xff08;kali生成payload存放位置&#xff09; shellcode bytearray(b"shellc…

外网nat+nat server,内网做路由过滤,以及ppp CHAR认证 企业网搭建

作业 网络拓扑图如下所示&#xff1a; 要求&#xff1a;做适当的截图&#xff0c;表示完成相应的操作。 按照网络拓扑要求搭建网络结构&#xff0c;按照个人学号配置每个节点的IP地址&#xff0c;其中X为班级号&#xff0c;Y为学号末尾2位&#xff1b;Y1为学号末尾2位1&#…

KekeBlog项目实战后台模块(二)(已完结)

十一、后台模块-菜单列表 菜单指的是权限菜单&#xff0c;也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表&#xff0c;不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…

【JAVA学习笔记】39 - final关键字

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter10/src/com/yinhai/final_ 一、final关键字基本介绍 final可以修饰类、属性、方法和局部变量&#xff0c; 在某些情况下&#xff0c;程序员可能有以下需求&#xff0c;就会使用到final 1)当…

宝塔部署nginx遇到的400错误和502错误

在部署express项目的过程中&#xff0c;由于我的代码有些变化&#xff0c;于是在宝塔面板上我又重新上传了一下我的项目&#xff0c;结果阴差阳错的被nginx反向代理配置不当引起的400错误request header or cokkie is too large和自己代码逻辑问题引起的502 bad gataway给绊倒了…

源码解析SpringMVC处理请求的完整流程

1.WebMvcAutoConfiguration EnableWebMvcConfiguration自动装配类负责加载SpringMVC涉及的HandlerAdapter、HandlerMapping、ExceptionHandlerExceptionResolver等。 SpringMVC利用 DispatchServlet 处理上游Tomcat的请求时,会被HandlerMapping、HandlerAdapter的相关子类分别…

vue3中computed的用法

一、完整代码 <template><div class"about"><h1>Computed的用法</h1><h3>姓:{{ person.firstName }}</h3><input type"text" v-model"person.firstName"><h3>名:{{ person.lastName }}</h3…

深度学习中的不确定性综述

领域学者&#xff1a; http://www.gatsby.ucl.ac.uk/~balaji/ 论文标题&#xff1a; A Survey of Uncertainty in Deep Neural Networks 论文链接&#xff1a; https://arxiv.org/pdf/2107.03342.pdf 概要 在过去的十年中&#xff0c;神经网络几乎遍及所有科学领域&#x…

2021年下半年 软件设计师 上午试卷(1-28)

计算机指令系统采用多种寻址方式。立即寻址是指操作数包含在指令中&#xff0c;寄存器寻址是指操作数在寄存器中&#xff0c;直接寻址是指操作数的地址在指令中。这三种寻址方式获取操作数的速度 &#xff08;1&#xff09; 。 &#xff08;1&#xff09; A. 立即寻址最快&am…

Springcloud介绍

1.基本介绍 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c;都可以用Spring Boot的开发风格做到一键启动和部署。Spring …

基于YOLO实现的口罩佩戴检测 - python opemcv 深度学习 计算机竞赛

文章目录 0 前言1 课题介绍2 算法原理2.1 算法简介2.2 网络架构 3 关键代码4 数据集4.1 安装4.2 打开4.3 选择yolo标注格式4.4 打标签4.5 保存 5 训练6 实现效果6.1 pyqt实现简单GUI6.3 视频识别效果6.4 摄像头实时识别 7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xf…

树与二叉树(考研版)

文章目录 树与二叉树树的基本概念结点、树属性的描述树的性质 二叉树的概念二叉树的性质二叉树的构建二叉树的遍历先序遍历中序遍历后序遍历层次遍历 递归算法和非递归算法的转换源代码 线索二叉树二叉树的线索化线索二叉树 找前驱/后继 树和森林树的存储 树与二叉树的应用哈夫…

Python 深度学习入门之CNN

CNN 前言一、CNN简介1、简介2、结构 二、CNN简介1、输出层2、卷积层3、池化层4、全连接层5、输出层 前言 1024快乐&#xff01;1024快乐&#xff01;今天开新坑&#xff0c;学点深度学习相关的&#xff0c;说下比较火的CNN。 一、CNN简介 1、简介 CNN的全称是Convolutiona…

java中的异常,以及出现异常后的处理【try,catch,finally】

一、异常概念 异常 &#xff1a;指的是程序在执行过程中&#xff0c;出现的非正常的情况&#xff0c;最终会导致JVM的非正常停止。 注意: 在Java等面向对象的编程语言中&#xff0c;异常本身是一个类&#xff0c;产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的…

Nginx 配置文件解读

一.配置文件解读 nginx配置文件主要分为四个部分&#xff1a; main{ #&#xff08;全局设置&#xff09;http{ #服务器配置upstream{} #&#xff08;负载均衡服务器设置&#xff09;server{ #&#xff08;主机设置&#xff1a;主要用于指定主机和端口&#xff09;location{} …

CUDA学习笔记(十四) Constant Memory

转载至https://www.cnblogs.com/1024incn/tag/CUDA/ CONSTANT MEMORY constant Memory对于device来说只读但是对于host是可读可写。constant Memory和global Memory一样都位于DRAM&#xff0c;并且有一个独立的on-chip cache&#xff0c;比直接从constant Memory读取要快得多…

【C++笔记】C++继承

【C笔记】C继承 一、继承的概念二、继承的语法和权限三、父类和子类成员之间的关系3.1、子类赋值给父类(切片)3.2、同名成员 四、子类中的默认成员函数4.1、构造函数4.2、拷贝构造4.3、析构函数 五、C继承大坑之“菱形继承”5.1、什么是“菱形继承”5.2、解决方法 一、继承的概…

数据结构-- 并查集

0. 引入 并查集是来解决等价问题的数据结构。 离散数学中的二元关系。 等价关系需满足自反性、对称性、传递性。 a ∈ S , a R a a R b & b R a a R b ∩ b R c > a R c a \in S, aRa \\ aRb \& bRa \\ aRb \cap bRc >aRc a∈S,aRaaRb&bRaaRb∩bRc>a…