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
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

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

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

return 0;
}
  1. 使用 g++ 附加 -g 参数编译程序
1
2
3
albert@home-pc:~$ g++ -g mainpro.cpp -o mainpro
albert@home-pc:~$ ls
mainpro mainpro.cpp
  1. 使用 gdb 命令来启动调试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 打印程序变量
1
2
3
4
5
6
7
8
9
10
(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 命令退出程序
1
2
3
4
5
6
7
(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 -q GDB启动、查看说明 [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年

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

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

2020-7-18 20:09:58

Albert Shi wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客