【GDB Debugger】新手快速入门学习笔记

文章目录

  • 前言
  • 第一讲 什么是GDB
  • 第二讲 搭建实验环境
  • 第三讲 快速开始
  • 第四讲 举例说明如何查看变量信息——print、step
  • 第五讲 使用GDB的技巧(只在此展开观察点)
  • 第六讲 调试core文件(针对UNIX,程序崩溃时)
  • 第七讲 调试一个正在运行的程序

前言

学习资源来自B站【小神仙讲 GDB】 通俗易懂版教程 | 一小时入门GDB | Debug | c/c++程序员必备 | 佩雨小神仙_哔哩哔哩_bilibili

第一讲 什么是GDB

GDB, the GNU Project debugger, allows you to see what is going on `inside’ another program while it executes – or what another program was doing at the moment it crashed.

GDB 调试器,帮助你检查程序运行时的内部情况

GDB 可以做以下4件事:

  • Start your program, specifying anything that might affect its behavior.启动并设置程序运行的参数
  • Make your program stop on specified conditions.使程序在确定情况下停止(打断点)
  • Examine what has happened, when your program has stopped.程序停止时,检查发生了什么
  • Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.修改程序,纠正错误

Those programs might be executing on the same machine as GDB (native), on another machine (remote), or on a simulator. GDB can run on most popular UNIX and Microsoft Windows variants, as well as on macOS.这些程序可以本地、远程或仿真器上运行,GDB可以在UNIX、Windows、macOS上运行

GDB支持以下语言:

  • Ada
  • Assembly(汇编)
  • C
  • C++
  • D
  • Fortran
  • Go
  • Objective-C
  • OpenCL
  • Modula-2
  • Pascal
  • Rust

第二讲 搭建实验环境

  1. 命令行检查电脑是否已经安装GDB

    GDB --version
    

    有版本信息即已经安装

  2. 如果未安装,则命令行执行

    yum install gdb
    
  3. 检查是否已经成功安装GDB

    GDB --version
    

    有版本信息即安装成功

第三讲 快速开始

  1. 写一个程序test.c

    #include <stdio.h>int main() {int arr[4] = {1, 2, 3, 4};int i;for(i = 0; i < 4;i++){printf("%d\n", arr[i]);}return 0;
    }
    
  2. 命令行编译该文件,生成可执行文件a.exe(Windows),记得加上-g,否则无法调试

    gcc -g test.c
    
  3. 开始调试

    gdb a.exe
    

    终端显示gdb的内容:

    GNU gdb (GDB) 8.1
    Copyright (C) 2018 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "x86_64-w64-mingw32".
    Type "show configuration" for configuration details.
    For bug reporting instructions, please see:
    http://www.gnu.org/software/gdb/bugs/.
    Find the GDB manual and other documentation resources online at:
    http://www.gnu.org/software/gdb/documentation/.
    For help, type "help".
    Type "apropos word" to search for commands related to "word"...
    Reading symbols from a.exe...done.
    (gdb)
    
  4. 让程序跑起来:命令”run”,run也可简写为r

    **(gdb) run**
    Starting program: C:\Users\xlay\Desktop\MATLAB-C\a.exe
    [New Thread 22268.0x27d0]
    [New Thread 22268.0x4928]
    1
    2
    3
    4
    [Thread 22268.0x4928 exited with code 0]
    [Inferior 1 (process 22268) exited normally]
    (gdb)
    
  5. 退出程序:命令“quit”

  6. 查看源代码:命令“list”

  7. 在某函数处打断点:

    1. 命令“break 函数名”

      **(gdb) break main** 
      Breakpoint 1 at 0x40155d: file ./caogao.c, line 5.
      (gdb)
      
    2. 命令“break 第几行”,break也可简写为b

    3. 查看断点:命令“info b”

    4. 运行下一行:命令“next”,也可简写为n(运行到下一个断点:n 6)

      **(gdb) list**
      1       #include <stdio.h>
      2       #include <stdlib.h>
      3
      4       int main() {
      5           int arr[4] = {1, 2, 3, 4};
      6           for(int i = 0; i < 4;i++){
      7               printf("%d\n", arr[i]);
      8           }
      9
      10          return 0;
      **(gdb) break 6**
      Breakpoint 2 at 0x401579: file ./caogao.c, line 6.
      **(gdb) b 9**
      Breakpoint 3 at 0x4015a3: file ./caogao.c, line 9.
      **(gdb) info b**
      Num     Type           Disp Enb Address            What
      1       breakpoint     keep y   0x000000000040155d in main at ./caogao.c:5
      2       breakpoint     keep y   0x0000000000401579 in main at ./caogao.c:6
      3       breakpoint     keep y   0x00000000004015a3 in main at ./caogao.c:9
      **(gdb) r**
      Starting program: C:\Users\xlay\Desktop\MATLAB-C\a.exe 
      [New Thread 4288.0x5b8c]
      [New Thread 4288.0x54f0]Thread 1 hit Breakpoint 1, main () at ./caogao.c:5
      5           int arr[4] = {1, 2, 3, 4};
      **(gdb) r**
      Starting program: C:\Users\xlay\Desktop\MATLAB-C\a.exe 
      [New Thread 4288.0x5b8c]
      [New Thread 4288.0x54f0]Thread 1 hit Breakpoint 1, main () at ./caogao.c:5
      5           int arr[4] = {1, 2, 3, 4};
      **(gdb) n**Thread 1 hit Breakpoint 2, main () at ./caogao.c:6
      6           for(int i = 0; i < 4;i++){
      **(gdb) n**
      7               printf("%d\n", arr[i]);
      (gdb)
      

第四讲 举例说明如何查看变量信息——print、step

  1. 命令“print”:可简写为p,打印变量

    **(gdb) list**
    1       #include <stdio.h>
    2
    3       int main() {
    4           int arr[4] = {1, 2, 3, 4};
    5           int i = 0;
    6           for(i = 0; i < 4;i++){
    7               printf("%d\n", arr[i]);
    8           }
    9
    10          return 0;
    **(gdb) b 4(在第4行打断点,运行到第4行,此时已经声明并初始化数组arr)**
    Breakpoint 1 at 0x40155d: file .\caogao.c, line 4.
    **(gdb) r**
    Starting program: C:\Users\xlay\Desktop\MATLAB-C\a.exe 
    [New Thread 7940.0x5990]
    [New Thread 7940.0x4a14]Thread 1 hit Breakpoint 1, main () at .\caogao.c:4
    4           int arr[4] = {1, 2, 3, 4};
    **(gdb) n(再执行n,运行到下一行)**
    5           int i = 0;
    **(gdb) p arr[0](打印arr[0]的位置,发现被赋值为1**
    $1 = 1
    **(gdb) p arr[3](发现被赋值为4**
    $2 = 4
    **(gdb) p &arr(得到这个数组的地址)**
    $3 = (int (*)[4]) 0x61fe00
    **(gdb) p &arr[0](得到第1个元素的地址)**
    $4 = (int *) 0x61fe00
    **(gdb) p &arr[1](得到第2个元素的地址,比上一个地址多4字节,为int的大小)**
    $5 = (int *) 0x61fe04
    
  2. 命令“step”:简写为s,进某一个具体的函数调试(要先打函数被调用处的断点)

    #include <stdio.h>void hello(){printf("hello echo\n");
    }int main() {int arr[4] = {1, 2, 3, 4};int i = 0;for(i = 0; i < 4;i++){printf("%d\n", arr[i]);}hello();return 0;
    }
    (gdb) list
    1       #include <stdio.h>
    2
    3       void hello(){
    4           printf("hello echo\n");
    5       }
    6
    7       int main() {
    8           int arr[4] = {1, 2, 3, 4};
    9           int i = 0;
    10          for(i = 0; i < 4;i++){
    (gdb) list(一次list看不完就再list)
    11              printf("%d\n", arr[i]);
    12          }
    13          hello();
    14
    15          return 0;
    16      }
    17       
    (gdb) r
    Starting program: C:\Users\xlay\Desktop\MATLAB-C\a.exe 
    [New Thread 4432.0x5f00]
    [New Thread 4432.0x4bbc]
    1
    2
    3
    4
    hello echo
    [Inferior 1 (process 4432) exited normally]
    (gdb) b 15
    Breakpoint 1 at 0x4015ca: file .\caogao1.c, line 15.
    (gdb) clear 15(断点打错,删除断点)  
    Deleted breakpoint 1 
    (gdb) b 13
    Breakpoint 2 at 0x4015c5: file .\caogao1.c, line 13.
    (gdb) r(到13行就停下)
    Starting program: C:\Users\xlay\Desktop\MATLAB-C\a.exe 
    [New Thread 24652.0x3644]
    [New Thread 24652.0x55c8]
    1
    2
    3
    4Thread 1 hit Breakpoint 2, main () at .\caogao1.c:13
    13          hello();
    (gdb) s(进入hello函数)
    hello () at .\caogao1.c:4
    4           printf("hello echo\n");
    (gdb) n
    hello echo
    5       }
    (gdb) n
    main () at .\caogao1.c:15
    15          return 0;
    (gdb) n
    16      }
    (gdb) n(结束)
    0x00000000004013c7 in __tmainCRTStartup ()
    (gdb)
    

第五讲 使用GDB的技巧(只在此展开观察点)

  1. shell在gdb中的使用

  2. 日志功能set logging on

  3. catch point

  4. 观察点:watchpoints,观察变量是否变化

    (gdb) list
    1       #include <stdio.h>
    2
    3       void hello(){
    4           printf("hello echo\n");
    5       }
    6
    7       int main() {
    8           int arr[4] = {1, 2, 3, 4};
    9           int i = 0;
    10          for(i = 0; i < 4;i++){
    (gdb) list
    11              printf("%d\n", arr[i]);
    12          }
    13          hello();
    14
    15          return 0;
    16      }
    17 
    (gdb) b 9
    Breakpoint 2 at 0x401594: file .\caogao1.c, line 9.
    (gdb) r
    Starting program: C:\Users\xlay\Desktop\MATLAB-C\a.exe 
    [New Thread 12436.0x651c]
    [New Thread 12436.0x2164]Thread 1 hit Breakpoint 2, main () at .\caogao1.c:9
    9           int i = 0;
    (gdb) p &i
    $1 = (int *) 0x61fe1c
    **(gdb) watch *0x61fe1c(把i(即*0x61fe1c)作为观察点)**
    Hardware watchpoint 3: *0x61fe1c
    (gdb) info watchpoints 
    Num     Type           Disp Enb Address            What
    3       hw watchpoint  keep y                      *0x61fe1c
    (gdb) n
    10          for(i = 0; i < 4;i++){
    (gdb) n
    11              printf("%d\n", arr[i]);
    (gdb) n
    1
    10          for(i = 0; i < 4;i++){
    **(gdb) n(i发生了变化)**Thread 1 hit Hardware watchpoint 3: *0x61fe1cOld value = 0
    New value = 1
    0x00000000004015bf in main () at .\caogao1.c:10
    10          for(i = 0; i < 4;i++){
    (gdb)
    

第六讲 调试core文件(针对UNIX,程序崩溃时)

本讲内容讲如何调试挂掉的程序、正在运行的程序

  1. 核心文件(core file),也称磁芯倾印(core dump),是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写入一个磁盘文件。这种信息往往用于调试。——来自维基百科

  2. 写一个会挂掉的程序

    #include <stdio.h>int main() {int* temp = NULL;*temp = 10;return 0;
    }
    
  3. 命令行gcc -g编译得a.out文件,运行./a.out,出现段错误segment fault

  4. 命令行ll,没有生成core文件,因为这个主机是多人共享的,会给每个用户一些使用限制的使用,而core文件比较大,不会默认生成,需要自行调整系统资源的设置

  5. 命令行ulimit -a查看当前shell的限制,发现core file size默认为0

  6. 命令行ulimit -c unlimited,再gcc -g编译.c文件,再执行./a.out,会出现错误segment fault(core dumped)

  7. 命令行ll,生成一个core文件“core.19761”

  8. 使用gdb进行debug:gdb ./a.out core.19761,即gdb 二进制文件 core文件

  9. 会直接走到出问题的地方

  • 总结:
    • gdb 二进制文件 core文件
    • 如果core文件没有生成,则需要查看自己的限制

第七讲 调试一个正在运行的程序

  1. 写一个可以一直运行的程序

     #include <stdio.h>void test(){}
    void test1(){int i = 0;i++;
    }
    int main() {while(1){test();test1();}return 0;
    }
  2. 命令行 gcc -g 编译,./a.out & 后台执行(Linux才有,Windows不行),因为程序是死循环,会占用现在的终端导致待会没法使用这么终端进行演示,所以选择后台进行

  3. 执行./a.out &后,显示程序的pid(进程标识符process identifier,又略称为进程ID、process IDPID——来自维基百科):21528

  4. GDB调试:命令行执行gdb -p 21528

  5. 发现此时执行到test()

  6. 命令行执行n,执行下一行,到test1()

  7. 命令行执行s,进入test1(),i=0,继续n,执行到i++

  8. 命令行执行p i,得到$1 = 0,符合预期

  9. 命令行执行n,执行下一行,到 }

  10. 命令行执行p i,得到$2 = 1,符合预期

    在这里插入图片描述

结束

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

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

相关文章

如何搭建“Docker Registry私有仓库,在CentOS7”?

1、下载镜像Docker Registry docker pull registry:2.7.1 2、运行私有库Registry docker run -d -p 5000:5000 -v ${PWD}/registry:/var/lib/registry --restartalways --name registry registry:2.7.1 3、拉取镜像 docker pull busybox 4、打标签&#xff0c;修改IP&#x…

uniapp可视范围高度 - 用户屏幕可操作的屏幕高度 - 适用于APP、H5@公众号、纯H5@Chrome

可视范围高度 let heightPx uni.getWindowInfo().windowHeight uni.getWindowInfo().windowTop 官方手册 uni.getWindowInfo() | uni-app官网uni-app,uniCloud,serverless,uni.getWindowInfo()https://uniapp.dcloud.net.cn/api/system/getWindowInfo.html 实测数据 uni.ge…

BI让数据分析不在困难,分解企业数据分析流程

一、数据培养 数据分析最关键的是什么&#xff1f;其实从名字上就可以看出来&#xff0c;数据是一切的关键&#xff0c;没有数据的话数据分析从何谈起呢。但数据的积累不是一天两天就能成功的&#xff0c;企业的一定要有培养数据的意识&#xff0c;在业务活动中沉淀数据&#…

开源堡垒机Jumpserver

开源堡垒机Jumpserver 文章目录 开源堡垒机Jumpserver1 Jumpserver介绍2 Jumpserver部署用户管理资产创建账号管理模板添加 用户组管理权限管理远程连接免密连接 1 Jumpserver介绍 Jumpserver 是全球首款完全开源的堡垒机&#xff0c;使用 GNU GPL v2.0 开源协议&#xff0c;是…

《论文阅读》EmpDG:多分辨率交互式移情对话生成 COLING 2020

《论文阅读》EmpDG:多分辨率交互式移情对话生成 COLING 2020 前言简介模型架构共情生成器交互鉴别器损失函数前言 亲身阅读感受分享,细节画图解释,再也不用担心看不懂论文啦~ 无抄袭,无复制,纯手工敲击键盘~ 今天为大家带来的是《EmpDG: Multi-resolution Interactive E…

文心一言赋能问卷生成,打造高效问卷调研工具

当前&#xff0c;各种大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;井喷式发展&#xff0c;基于LLM的应用也不断涌现。但是&#xff0c;当开发者基于LLM开发下游应用时&#xff0c;LLM直接生成的结果在格式、内容等方面都存在许多不确定因素&#xf…

Cesium:绘制一个 3DTiles 对象的外包盒顶点

作者:CSDN @ _乐多_ 本文将介绍如何使用 Cesium 引擎根据模型的中心坐标,半轴信息,绘制一个 3DTiles 对象的外包盒顶点。 外包盒是一个定向包围盒(Oriented Bounding Box),它由一个中心点(center)和一个包含半轴(halfAxes)组成。半轴由一个3x3的矩阵表示,这个矩阵…

Python Web开发记录 Day13:Django part7 Ajax入门与案例(任务管理)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、Ajax入门①简介②工作原理③优点④缺点⑤使用…

upload-labs-pass01

1.安装好环境进入关卡&#xff08;记得打开小皮&#xff09; 2.可以看到第一关是要求上传图片&#xff0c;但是同时限制了图片类型&#xff0c;那么如果我们将木马写入图片&#xff0c;但是类型又不在白名单&#xff0c;就要想办法绕过 3.可以看到这里的要求是有check&#xff…

中国银行信息系统应用架构发展历程

概述&#xff1a; 从 20 世纪 80 年代开始至今&#xff0c;我国银行业信息化历程已 有四十年历史。虽然相对于发达国家来讲&#xff0c;我国银行业务信 息化起步较晚&#xff0c;但发展速度很快&#xff0c; 目前我国一些大型商业银行的信息化程度已经处于全球领先水平。 “银行…

web渗透测试漏洞复现:Elasticsearch未授权漏洞复现

web渗透测试漏洞复现 Elasticsearch未授权漏洞复现Elasticsearch简介Elasticsearch复现Elasticsearch漏洞修复和加固措施 Elasticsearch未授权漏洞复现 Elasticsearch简介 Elasticsearch 是一款 Java 编写的企业级搜索服务&#xff0c;它以分布式多用户能力和全文搜索引擎为特…

Vue3学习日记 Day4 —— pnpm,Eslint

注&#xff1a;此课程需要有Git的基础才能学习 一、pnpm包管理工具 1、使用原因 1.1、速度快&#xff0c;远胜过yarn和npm 1.2、节省磁盘空间 2、使用方式 2.1、安装方式 npm install -g pnpm 2.2、创建项目 pnpm create vue 二、Eslint配置代码风格 1、环境同步 1、禁用Pret…

webpack5零基础入门-11处理html资源

1.目的 主要是为了自动引入打包后的js与css资源&#xff0c;避免手动引入 2.安装相关包 npm install --save-dev html-webpack-plugin 3.引入插件 const HtmlWebpackPlugin require(html-webpack-plugin); 4.添加插件&#xff08;通过new方法调用&#xff09; /**插件 *…

外贸网站文章批量生成器

随着全球贸易的不断发展&#xff0c;越来越多的企业开始关注外贸市场&#xff0c;而拥有高质量的内容是吸引潜在客户的关键之一。然而&#xff0c;为外贸网站生产大量优质的文章内容可能是一项耗时且繁琐的任务。因此&#xff0c;外贸网站文章批量生成软件成为了解决这一难题的…

【Spring MVC】Spring MVC拦截器(Interceptor)

目录 一、拦截器介绍 二、拦截器 Interceptor 定义 2.1 HandlerInterceptor接口 2.2 Spring MVC中提供的一些HandlerInterceptor接口实现类 1、AsyncHandlerInterceptor 2、WebRequestInterceptor 3、MappedInterceptor 4、ConversionServiceExposingInterceptor 三、拦…

研究人员发现 OpenAI ChatGPT、Google Gemini 的漏洞

自 OpenAI 推出 ChatGPT 以来&#xff0c;生成式 AI 聊天机器人的数量及其在企业中的采用率在一年多时间里呈爆炸式增长&#xff0c;但网络安全专业人士的担忧也随之增加&#xff0c;他们不仅担心威胁组织对新兴技术的使用&#xff0c;还担心大型网络的安全性及模型&#xff08…

Chrome历史版本下载地址:Google Chrome Older Versions Download (Windows, Linux Mac)

最近升级到最新版本Chrome后发现页面居然显示错乱,是在无语, 打算退回原来的版本, 又发现官方只提供最新的版本下载, 为了解决这个问题所有收集了Chrome历史版本的下载地址分享给大家. Google Chrome Windows version 32-bit VersionSizeDate104.0.5112.10279.68 MB2022-05-30…

【小迪安全】学习cho1

介绍了一些名词&#xff1a; POC、EXP、Payload与Shellcode nc -lvvp 端口号 监听服务器端口 个人用机使用最多的是&#xff1a;windows10 服务器用机使用最多的是&#xff1a;Windows8&#xff0c;12&#xff0c;16 流量被防火墙拦截了&#xff0c;到这里进行给与权限 文件…

【CNN轻量化】RepViT: Revisiting Mobile CNN From ViT Perspective

RepViT: Revisiting Mobile CNN From ViT Perspective 论文链接&#xff1a;https://arxiv.org/abs/2307.09283 代码链接&#xff1a;https://github.com/THU-MIG/RepViT 一、摘要 探究了许多轻量级ViTs和轻量级CNNs之间的结构联系。文中从ViT的视角重新审视轻量级CNNs的高效…

Java 中的泛型(两万字超全详解)

文章目录 前言一、泛型概述1. 什么是泛型&#xff1f;为什么要使用泛型&#xff1f;2. 泛型使用场景3. 泛型概述小结 二、泛型类1. 泛型类的定义2. 泛型类的使用 三、泛型接口四、泛型方法1. 泛型方法的定义2. 泛型方法的使用3. 泛型方法中的类型推断 五、类型擦除1. 什么是类型…