当前位置:网站首页>GDB使用详解
GDB使用详解
2022-07-29 11:36:00 【guoqiang_sunshine】
1. gdb 作用
GDB 支持调试多种编程语言编写的程序,包括 C、C++、Go、Objective-C、OpenCL、Ada 等。实际场景中,GDB 更常用来调试 C 和 C++ 程序。一般来说,GDB主要帮助我们完成以下四个方面的功能:
- 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
- 在某个指定的地方或条件下暂停程序。
- 当程序被停住时,可以检查此时你的程序中所发生的事。
- 在程序执行过程中修改程序中的变量或条件,将一个bug产生的影响修正从而测试其他bug。
2. 使用GDB调试程序,有以下两点需要注意:
- 要使用GDB调试某个程序,该程序编译时必须加上编译选项 -g,否则该程序是不包含调试信息的;
- GCC编译器支持 -O 和 -g 一起参与编译。GCC编译过程对进行优化的程度可分为5个等级,分别为 :
优化等级
-O/-O0: 不做任何优化,这是默认的编译选项 ;
-O1:使用能减少目标文件大小以及执行时间并且不会使编译时间明显增加的优化。 该模式在编译大型程序的时候会花费更多的时间和内存。在 -O1下:编译会尝试减少代 码体积和代码运行时间,但是并不执行会花费大量时间的优化操作。
-O2:包含 -O1的优化并增加了不需要在目标文件大小和执行速度上进行折衷的优化。 GCC执行几乎所有支持的操作但不包括空间和速度之间权衡的优化,编译器不执行循环 展开以及函数内联。这是推荐的优化等级,除非你有特殊的需求。 -O2会比 -O1启用多 一些标记。与 -O1比较该优化 -O2将会花费更多的编译时间当然也会生成性能更好的代 码。
-O3:打开所有 -O2的优化选项并且增加 -finline-functions, -funswitch-loops,-fpredictive-commoning, -fgcse-after-reload and -ftree-vectorize优化选项。这是最高最危险 的优化等级。用这个选项会延长编译代码的时间,并且在使用 gcc4.x的系统里不应全局 启用。自从 3.x版本以来 gcc的行为已经有了极大地改变。在 3.x,,-O3生成的代码也只 是比 -O2快一点点而已,而 gcc4.x中还未必更快。用 -O3来编译所有的 软件包将产生更 大体积更耗内存的二进制文件,大大增加编译失败的机会或不可预知的程序行为(包括 错误)。这样做将得不偿失,记住过犹不及。在 gcc 4.x.中使用 -O3是不推荐的。
-Os:专门优化目标文件大小 ,执行所有的不增加目标文件大小的 -O2优化选项。同时 -Os还会执行更加优化程序空间的选项。这对于磁盘空间极其紧张或者 CPU缓存较小的 机器非常有用。但也可能产生些许问题,因此软件树中的大部分 ebuild都过滤掉这个等 级的优化。使用 -Os是不推荐的。
3. 启用GDB调试
GDB调试主要有三种方式:
- 直接调试目标程序:gdb ./hello_server
- 附加进程id:gdb attach pid
- 调试core文件:gdb filename corename
4. 常用命令

5. 常用命令示例
gdb ./execute/linux/plat_analyse /home/sun/nolovr/doc/
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04.1) 9.2
Copyright (C) 2020 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 ./execute/linux/plat_analyse...
(No debugging symbols found in ./execute/linux/plat_analyse)
/home/sun/nolovr/doc/: No such file or directory.
(gdb) run
Starting program: /home/sun/nolovr/svopro/build/execute/linux/plat_analyse
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_M_construct null not valid
Program received signal SIGABRT, Aborted.
__GI_raise (sig=[email protected]=6) at ../sysdeps/unix/sysv/linux/raise.c:50
50 ../sysdeps/unix/sysv/linux/raise.c: No such file or
5.1 next、step命令, next 和 step 都是单步执行,但也有差别:
next 是 单步步过(step over),即遇到函数直接跳过,不进入函数内部。
step 是 单步步入(step into),即遇到函数会进入函数内部。
5.2 jump命令 命令格式及作用:
jump LineNo,跳转到代码的 LineNo 行的位置;
jump +10,跳转到距离当前代码下10行的位置;
jump *0x12345678,跳转到 0x12345678 地址的代码处,地址前要加星号;
jump 命令有两点需要注意的:
中间跳过的代码是不会执行的;
跳到的位置后如果没有断点,那么GDB会自动继续往后执行;
5.3 最常用的就是 break 命令,有些场景中还会用到 tbreak 或者 rbreak 命令
break 命令(可以用 b 代替)常用的语法格式有以下 2 种。
1、(gdb) break location // b location
2、(gdb) break ... if cond // b .. if cond
- 第一种格式中,location 用于指定打断点的具体位置,其表示方式有多种,如表 1 所示。


- 第二种格式中,… 可以是表 1 中所有参数的值,用于指定打断点的具体位置;cond 为某个表达式。整体的含义为:每次程序执行到 … 位置时都计算 cond 的值,如果为 True,则程序在该位置暂停;反之,程序继续执行。
如下演示了以上 2 种打断点方式的具体用法:
6. 参考资料
https://www.sourceware.org/gdb/documentation/
http://c.biancheng.net/gdb/
边栏推荐
- AMH6.X升级到AMH7.0后,登录后台提示MySQL连接出错怎么解决?
- How to use grep to find pattern matching across multiple lines
- Niuke net brush questions
- 即学即用的问题解决思维,给无意识的生活装上“后视镜”
- 考完PMP后有什么益处
- 8. Interleave - understand ThreadPoolExecutor thread pool from architecture design to practice
- "Knowledge Collection" article to understand mysql index!!(recommended collection)
- The heavyweight foundation awarded platinum, gold and silver donors
- 1.MySQL数据库的介绍
- AI全流程开发难题破解之钥
猜你喜欢

为什么应该在开发环境中使用 Kubernetes

怎么以管理员身份运行cmd?以管理员身份运行cmd方法介绍

Lucky draw system with background source code

使用Tenserboard可视化深度学习训练过程

HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界

迁徙数据平台简单介绍

QML(二):设置自定义窗体

【图像检测】基于灰度图像的积累加权边缘检测方法研究附matlab代码

How to use grep to find pattern matching across multiple lines

Watch the open source summit first | quick view of the sub Forum & Activity agenda on July 29
随机推荐
Matplotlib Chinese question
『面试知识集锦100篇』1.面试技巧篇丨HR的小心思,你真的懂吗?
从零开始Blazor Server(3)--添加cookie授权
考完PMP后有什么益处
[image detection] Research on cumulative weighted edge detection method based on gray image, with matlab code
Summer vacation training week1
AI model risk assessment Part 2: core content
GBase8s核心数据备份
多线程顺序运行的 4 种方法,面试随便问!
怎么以管理员身份运行cmd?以管理员身份运行cmd方法介绍
Peking University open classes are coming! Welcome to the "AI for science" class
学习周刊-总第64期-一个v2ex风格的开源论坛程序
宝塔快速搭建自适应咖啡网站模板与管理系统源码实测
Paddlelite compilation and code running through the disk
[SwiftUI 开发] @State @Binding @ObservedObject @EnvironmentObject
力扣sql刷题(四)
mysql单行,多行子查询
From scratch Blazor Server (3) - add cookie authorization
【图像处理】基于中轴变换实现图像骨架提取附matlab代码
Talk about the establishment of performance testing environment