当前位置: 首页 > news >正文

GDB调试指北大全

文章目录

  • 前言
  • GDB能做什么
  • GDB调试步骤
  • GDB调试示例
  • GDB启动参数与命令列表(持续更新)
  • 总结

前言

GDB 作为程序调试利器,是一个受通用公共许可证(GPL)保护的自由软件,全称是 GNU Debugger,又常常被称为 GNU symbolic debugger 或者 GNU project debugger,能够帮助开发者调试程序,分析应用程序运行过程。目前支持调试 CC++DGoObjective-CFortranJavaOpenCL CPascalassemblyModula-2Ada 等多种编程语言。

GDB能做什么

GDB 是调试程序的强大武器,能够帮助开发者找出程序出现BUG的原因,但是不要指望它能自己查问题,它仅仅是一个工具,可以帮助我们查找问题原因,常常被用来做以下事情:

  • 分析程序崩溃的原因
  • 查找程序表现出错误行为的原因
  • 找到一些从源码上难以发现的逻辑错误

GDB调试步骤

  1. 使用 g++ 附加 -g 参数编译程序,g++ -g mainpro.cpp -o mainpro
  2. 使用 gdb 程序来启动调试我们自己构建的程序,gdb mainpro
  3. 使用 runbreakprint 等命令调试程序
  4. 使用 quit 命令退出程序

GDB调试示例

  1. 编写示例程序代码,保存到文件 mainpro.cpp
#include <iostream>

int main()
{
    int a = 110, b = 119, c;

    c = a + b;
    std::cout << "c = " << c << std::endl;

    return 0;
}
  1. 使用 g++ 附加 -g 参数编译程序
albert@home-pc:~$ g++ -g mainpro.cpp -o mainpro
albert@home-pc:~$ ls
mainpro  mainpro.cpp
  1. 使用 gdb 命令来启动调试
albert@home-pc:~$ gdb mainpro
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 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-linux-gnu".
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 mainpro...done.
(gdb)
  1. 使用 break 8 在第8行打断点,使用 run 命令启动程序,使用 print c 打印程序变量
(gdb) break 8
Breakpoint 1 at 0x4008b7: file mainpro.cpp, line 8.
(gdb) run
Starting program: /home/albert/mainpro

Breakpoint 1, main () at mainpro.cpp:8
8       std::cout << "c = " << c << std::endl;
(gdb) print c
$1 = 239
(gdb)
  1. 使用 quit 命令退出程序
(gdb) quit
A debugging session is active.

    Inferior 1 [process 227] will be killed.

Quit anyway? (y or n) y
albert@home-pc:~$

GDB启动参数与命令列表(持续更新)

GDB 众多的启动参数和命令提供了强大的调试功能,每一条都可以展开得到很多知识,这些知识的学习是一个持续的过程,短时间无法消化和吸收,所以准备总结一个系列,从最简单的命令开始总结,持续更新学习下去,文章链接不定期更新。

GDB命令备注参考文章
gdbgdb -qGDB启动、查看说明GDB调试指北-启动GDB并查看说明信息
gdb progdb pro 123启动调试程序、调试正在运行的程序[GDB调试指北-使用GDB启动调试]
directory new-path查看调试源码GDB调试指北-查找丢失源码文件
set substitute from-path to-path查看调试源码GDB调试指北-查找丢失源码文件

总结

  • GDB 调试技巧更多的是工具本身的功能,所谓“重剑无锋,大巧不工”,熟练利用这个工具才能发挥最大的威力
  • 知识的学习时一个持续的过程,只有不断的学习和总结才能不断进步,而不要被那些花里胡哨的外表所迷惑
  • 有些知识学着学着就通了,前几天看到 printf 这个函数,很疑惑为什么末尾要加个 f,猜想它是格式化 format 的意思
  • 经过查证果然如此,此时距离第一次在 C 语言中学习 printf 函数已经过去了10年

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

大漠孤烟直,长河落日圆~

相关文章:

  • 小白眼中的docker究竟是个什么东西
  • GDB调试指北-启动GDB并查看说明信息
  • Redis源码-BFS方式浏览main函数
  • GDB调试指北-启动调试或者附加到进程
  • Python中时间戳、时间字符串、时间结构对象之间的相互转化
  • git log根据特定条件查询日志并统计修改的代码行数
  • C++中优先队列priority_queue的基础用法
  • C++求解组合数的具体实现
  • 东拉西扯01世界的沧海桑田
  • Go语言在解决实际问题时的优点与不便
  • 使用Spreadsheet Compare工具对比Excel文件差异
  • linux环境下使用sort命令完成常见排序操作
  • 关于数据一致性的思考
  • linux环境下sed命令的基础用法
  • 学习cmake从成功编译一个小程序开始
  • 深入了解以太坊
  • angular学习第一篇-----环境搭建
  • Consul Config 使用Git做版本控制的实现
  • es6
  • extjs4学习之配置
  • HTTP中GET与POST的区别 99%的错误认识
  • JavaScript中的对象个人分享
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • oldjun 检测网站的经验
  • Phpstorm怎样批量删除空行?
  • SpingCloudBus整合RabbitMQ
  • uva 10370 Above Average
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 读懂package.json -- 依赖管理
  • 规范化安全开发 KOA 手脚架
  • 排序算法学习笔记
  • 前端之React实战:创建跨平台的项目架构
  • 区块链将重新定义世界
  • 使用agvtool更改app version/build
  • 使用API自动生成工具优化前端工作流
  • 终端用户监控:真实用户监控还是模拟监控?
  • - 转 Ext2.0 form使用实例
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (附源码)ssm高校实验室 毕业设计 800008
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (三)终结任务
  • (转)ObjectiveC 深浅拷贝学习
  • ***原理与防范
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET处理HTTP请求
  • .NET单元测试
  • .sys文件乱码_python vscode输出乱码
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • []Telit UC864E 拨号上网
  • [2013][note]通过石墨烯调谐用于开关、传感的动态可重构Fano超——
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [android学习笔记]学习jni编程