GDB 调试

1. wsl 环境下搭建gdb:

1.1安装环境:

#安装gcc编译器 (x86 linux)

$ sudo apt install gcc

#检查安装版本,看是否成功

$ gcc -v

#安装gdb编译器 (x86 linux)

$ sudo apt install gdb

#检查安装是否成功

$ gdb

1.2 编写自己的程序,并验证:

#-g代表带有调试信息

$  gcc a.c -o adebug -g

#查看debug段信息

$ readelf -S adebug | grep debug

#开始调试程序

$ gdb adebug

附录:

gdb命令:

启动/退出

  1. run/r: 启动程序
    • run [arguments...] : 以 [arguments] 的参数启动程序,其中 [arguments...] 可选
    • run > [file_name]: 启动程序,程序的输入保存到 file_name 文件中
  2. start : 运行程序到 main 函数的第一行代码
    • start [arguments...]: 以参数列表 [arguments] 运行程序,其中 [arguments...] 可选
  3. args
    • show args : 查看当前程序启动时的参数列表
    • set args : 设置程序启动时的参数列表,run/r 启动后才会生效
  4. kill: 停止程序
  5. quit/q: 退出程序

日志

  1. logging
    • set logging on/off: 打开/关闭日志文件
    • set logging file [file_name]: 日志输出到 file_name 中,默认文件名为 gdb.txt

执行

  1. step/s: 单步运行(可以执行到函数内部)
    • step [number]: 逐语句执行 [number] 步
  2. next/n: 同上,但是不会进入到函数内部
    • next [number]: 逐语句执行 [number] 步
  3. continue/c: 继续运行直到断点处
    • continue [number]: 继续执行,忽略 [number] 次的命中
  4. where: 显示当前执行的具体函数和代码行

断点

  1. breakpoints: 断点
    • break/b : 在下一指令出设置断点
    • break [file_name]:[line_number]/[line_number]: 在指定文件的行/行处设置断点
    • break [function_name] / [class_name]:[function_name] / [file_name]:[function_name]: 在函数、指定类的成员函数、指定文件的函数处设置断点
    • break *[address]: 在指定地址设置断点
    • break +/- [offset]: 在当前代码行 加上/减去 偏移量的位置设置断点
    • break [line_number] if [condition]: 设置条件变量
    • tbreak: 设置临时变量
    • break if condition:设置条件断点,仅当condition为真时才触发断点。
  2. watchpoints: 观察断点
    • watch [variable]: 监控变量 [variable] 当变量的值发生变化时命中该断点
    • watch [varibale_1] + [variable_2]: 监控两个变量值
    • watch (type)[address]: 通过内存地址间接设置断点
    • watch [variable] thread [thread_number]: 监控线程[number]修改变量时触发中断
    • info watchpoints: 查看数据断点类型列表
  3. catchpoints: 捕获断点
    • catch throw: 捕获 C++ 抛出异常事件
    • catch catch: 捕获 C++ 捕获到异常事件
    • catch exec: 捕获 exec 函数被调用(进程替换函数)
    • catch fork: 捕获 fork 函数被调用
    • catch vfork: 捕获 vfork 函数被调用(创建子进程,并且子进程先执行,退出或者被替换后再执行父进程)
    • catch load/unload [libname]: 捕获加载/卸载 [libname] 动态库事件,[libname] 可选
  4. 显示/删除断点
    • info break/b: 显示所有类型断点
    • info watchpoints/catchpoints: 显示数据断点类型/捕获断点类型列表
    • clear [line]/[file]:[line]/[function]: 清除指定位置的所有断点,如果有多个同名函数的断点,则也会被全部删除
    • delete/d [Num]: 删除编号为 Num 的断点, [Num]可选,如果没有该参数,则是删除所有断点
    • delete/d [num1]-[num2] [num3]-[num4]: 删除编号区域内的断点
    • enable/disable [Num]: 启用/禁用编号为 Num 的断点
    • save break/b [file_name]: 保存断点信息到 [file_name] 文件中
    • source [file_name]: 导入文件 [file_name] 中的断点信息
    • delete 删除断点是全局的,clear删除当前函数内部的断点,不加参数则表示删除的是将要执行的下一处断点,clear不能删除观察点和捕获点
  5. layout /退出(ctrl+x+a):       
    • layout asm :显示汇编界面
    • layout next :切换到下一个窗口
    • layout prev : 切换到上一个窗口 
    • layout regs : 显示寄存器状态窗口
    • layout split : 将源代码和汇编代码窗口分割成两个窗口
    • layout src : 显示源代码窗口。

程序栈

  1. backtrace:打印栈帧
    • backtrace/bt [number]: 打印 [number] 个栈帧,参数可选
    • bt full [n]: 从内到外显示 n 个栈帧及其局部变量,参数 n 可选
    • bt full -[n]: 从外到内显示 n 个栈帧及其局部变量
  2. frame: 切换栈帧
    • frame/f [number]: 切换到第 [number] 个栈帧,如果不存在,则打印当前栈帧
    • up [number]: 选择当前栈帧编号 + [number]的栈帧
    • down [number]: 选择当前栈帧编号 - [number]的栈帧
    • info frame [addr]: 描述当前选择的栈帧, [addr]可选
  3. info
    • info args: 显示当前栈帧的参数列表
    • info locals: 显示当前栈帧的局部变量
  4. finish: 执行完当前函数,并打印返回值,然后触发断点
  5. return 0: 不再执行当前函数后面的指令,直接返回。可以指定返回值
  6. call/print [function_name]: 调用函数
  7. set var [variable]=[value]: 给变量[variable]赋值

多进程

  • attach [pid]: 绑定进程 pid
  • info inferiors: 显示进程列表
  • inferior [num]: 切换到编号为 num 的进程上调试
  • set follow-fork-mode child/parent: 追踪子进程/父进程
  • set detach-on-fork on/off: fork 调用时只追踪其中一个进程/同时追踪父子进程
  • set schedule-multiple on: 默认调试当前进程时,其他进程处于挂起状态。该命令设置调试时所有进程都在执行

多线程

  • info threads: 查看线程列表
  • thread [num]: 切换到线程编号为 num 的线程进行调试
  • set scheduler-locking on/off: 调试一个线程时,其他线程暂停执行/同步执行
  • set scheduler-locking step: 仅用step调试线程时其他线程不执行,用其他命令如 next 调试时执行

显示打印

  1. print
    • print *[array]@[number]: 打印数组 [array] 从开头连续的 [number] 个元素的值
    • print [array][index]@[number]: 打印数组 [array] 以 [index] 为起点的 [number] 个元素
      • print array[10]@10: 答应数组 arrray 的第 10~19个元素
    • print [variable]=[value]: 修改查看到的变量的值,结构体或者类对象的成员值也可以用这种发那是修改
    • set print array-indexes on: 打印数组的同时打印数组的下标
    • print (struct [struct_name])[ptr]: 查看指针 [ptr] 指向的结构体的内容
    • print [ptr]: 查看该指针指向的类型及指针地址
    • print/p [struct_name]: 直接显示结构体
    • set print pretty on: 每行只显示结构的一名成员
    • set print null-stop: 不显示 "\000"
  2. display
    • info display: 查看显示列表
    • display [variable]/*[ptr]/[struct_name]: 每次触发命中都会打印对应的内容
  3. x/s: 打印 ASCII 字符串
    • x [ptr]: 显示16进制内容
    • x/s [ptr]: 显示十进制内容,
    • x/[number]d [prt]: 以宽度为 number 显示内容
    • x 可以用来查看结构体如何存储的
      • x/16s [ptr]
  4. ptype
    • ptype [optional arguments] [variable]/[type]
      • 可选参数中:
        • /r: 以原始数据的方式显示
        • /M,/m: 显示类的方法
        • /t: 不打印类中的 typedef 数据
        • /o: 打印结构体字段的偏移量和大小
  5. whatis: 打印变量的类型
    • whatis [/flags] [arg]

调试和保存core文件

  1. file [file_exec]: 加载可执行文件符号表信息
  2. core [core_file]: 加载 core-dump 文件
  3. gcore [core_file]: 生成 core-dumo 文件,记录当前进程的状态

汇编

  1. disassemble [function_name]: 查看函数的汇编代码
  2. disassemble /mr [function_name]: 同时比较函数源代码和汇编代码

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

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

相关文章

刷题学习日记 (1) - SWPUCTF

写这篇文章主要是想看看自己一个下午能干啥,不想老是浪费时间了,所以刷多少题我就会写多少题解,使用nss随机刷题,但是今天下午不知道为啥一刷都是SWPUCTF的。 [SWPUCTF 2021 新生赛]gift_F12 控制台ctrlf搜索flag即可&#xff0…

处理not in gzip format异常

1、为什么会触发这个异常? 当我们使用GZIPInputStream的read方法进行读取数据时,它会自动处理gzip格式的压缩数据,将它解析成原始的二进制数据。但是,如果你没有将原始数据进行gzip压缩后传入GZIPInputStream流,进行r…

车载诊断技术:汽车健康的守护者

一、车载诊断技术的发展历程 从最初简单的硬件设备到如今智能化、网络化的系统,车载诊断技术不断演进,为汽车安全和性能提供保障。 早期的汽车诊断检测技术处于比较原始的状态,主要依靠操作经验和主观评价。随着汽车工业的发展,车载诊断技术也经历了不同的阶段。20 世纪初…

视频融合共享平台LntonAIServer视频智能分析抖动检测算法和过亮过暗检测算法

LntonAIServer作为一款智能视频监控平台,集成了多种先进的视频质量诊断功能,其中包括抖动检测和过暗检测算法。这些算法对于提升视频监控系统的稳定性和图像质量具有重要意义。 以下是对抖动检测算法和过暗检测算法的应用场景及优势的详细介绍。 一、L…

数据分析:线性回归计算嵌套的组间差异

文章目录 介绍加载依赖包导入数据数据预处理数据概览线性回归画图森林图的特点:森林图的作用:总结系统信息介绍 在统计学中,嵌套的组间差异分析是一种评估不同组别间差异的方法,尤其适用于层级结构或分组数据。通过线性回归模型,我们可以计算出各个变量对于因变量的影响,…

基于Node.js+Express+MySQL+VUE新闻网站管理系统的设计与实现

1. 引言 随着互联网技术的发展,人们获取信息的方式发生了巨大的变化。传统的新闻媒体逐渐向数字化、智能化方向发展。新闻推荐网站管理系统能够帮助新闻网站更好地管理和推荐新闻内容,提高用户体验。本文将详细介绍一个新闻推荐网站管理系统的整体设计与…

《十年国庆游,洞察中国旅游新趋势》

作者:侯炯 一、十年国庆旅游数据总览 过去十年,中国国庆旅游市场呈现出丰富的变化和强劲的发展态势。从接待游客人次来看,2014 年接待国内游客 4.75 亿人次,到 2019 年已增长至 7.82 亿人次,2023 年国内旅游出游人数更…

北斗三号多模对讲机TD70:公专网融合、数模一体、音视频调度,推动应急通信效能升级

随着国家对应急通信和精准定位技术的重视程度不断提高,相关技术和设备的研发与应用也得到了迅猛发展。特别是在边防巡逻、林业巡防、海上作业等领域,通信设备的可靠性和功能性直接关系到人员的生命安全和任务的成功完成。 近年来,我国政府高度…

深度学习500问——Chapter17:模型压缩及移动端部署(1)

文章目录 17.1 模型压缩理解 17.2 为什么需要模型压缩和加速 17.3 模型压缩的必要性及可行性 17.4 目前有哪些深度学习模型压缩方法 17.4.1 前段压缩和后端压缩对比 17.4.2 网络剪枝 17.4.3 典型剪枝方法对比 17.4.4. 网络蒸馏 17.4.5 前端压缩 17.4.6 后端压缩 深度神经网络在…

A股收复3000点!外资积极看涨,对冲基金净买入量创三年来新高

9月27日,A股开盘后跳空上涨,连续四天的大幅上涨,9月26日,上证指数收复3000点大关,让一些温州股民感到兴奋不已,一些炒股群里沸腾了。但对于行情走势,股民们产生了分歧,有人是逢高减仓…

高防服务器有用吗?租用价格一般多少

高防服务器有用吗?有用。高防服务器是一种具备高度防御能力的服务器,主要用于应对DDoS攻击、CC攻击等网络威胁。它通过专业的硬件设备和先进的防御算法,为用户提供持续、稳定的网络安全防护。高防服务器的主要特点包括强大的防御能力、低延迟…

【Koa】初识 Koa

1. Koa 特点 1.1 更好的处理异步 Koa 的核心设计是基于 async/await 异步编程模型。这使得 Koa 可以更好地处理异步操作,相比于传统的回调方式,代码更清晰且更易于维护。 1.2 无内置中间件 与 Express 不同,Koa 并没有内置任何中间件&…

深入探讨在线教育系统源码:搭建知识付费平台实战方案详解

知识付费平台是软件开发行业内炙手可热的项目,其受众群体非常广,也是很多小伙伴提问比较多的,今天小编将从在线教育系统源码开始,为大家讲解一个知识付费平台的搭建开发实战方案。 一、系统架构设计 搭建在线教育系统需考虑以下几…

2025 年 IT 前景:机遇与挑战并存,人工智能和云计算成重点

云计算de小白 投资人工智能:平衡潜力与实用性 到 2025 年,人工智能将成为 IT 支出的重要驱动力,尤其是在生成式人工智能领域。人工智能的前景在于它有可能彻底改变业务流程、增强决策能力并开辟新的收入来源。然而,现实情况更加微…

数据集-目标检测系列-兔子检测数据集 rabbit >> DataBall

数据集-目标检测系列-兔子检测数据集 rabbit >> DataBall 数据集-目标检测系列-兔子检测数据集 rabbit 数据量:8k 想要进一步了解,请联系。 DataBall 助力快速掌握数据集的信息和使用方式,会员享有 百种数据集,持续增加…

基于PI控制器的车辆行驶控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 步骤一: 确定目标与测量 4.2 步骤二: 计算误差 4.3 步骤三: 设计PI控制器 4.4 步骤四: 应用控制信号 4.5 步骤五: 反馈循环 5.完整工程文件 1.课题概述 基于PI控制器的车辆行驶控制系统是一种常…

OpenCV视频I/O(14)创建和写入视频文件的类:VideoWriter介绍

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 视频写入器类。 该类提供了用于写入视频文件或图像序列的 C API。 cv::VideoWriter 类是 OpenCV 库中用于创建和写入视频文件的一个类。它提供了…

中国国画-孙溟㠭浅析碑帖《龙藏寺碑》

中国国画——孙溟㠭浅析碑帖《龙藏寺碑》 《龙藏寺碑》 《龙藏寺碑》 全称是《恒州刺史鄂国公为国劝造龙藏寺碑》,属楷书体。碑通高3.15米,宽0.90米,厚0.29米。碑文楷书30行,行50字,1500余字,碑为龟趺。…

C语言—顺序表(含通讯录项目)

目录 一、顺序表的概念及结构 二、顺序表的分类 (2.1)静态顺序表 (2.2)动态顺序表 三、动态顺序表的实现 (3.1)基本结构定义 (3.2)初始化和销毁 (3.2.1&#xff0…

vue中使用exceljs和file-saver插件实现纯前端表格导出Excel(支持样式配置,多级表头)

实现:使用Excel.js库创建excel文件,然后再使用 file-saver库将 Excel 文件保存到用户的本地计算机。 1.安装,可以使用npm,yarn npm install exceljs npm install file-saver 2.封装生成excel的方法 // 封装exceljs const ExcelJ…