Linux C++ 开发6 - GDB调试入门指南

2024-09-01 17:28

本文主要是介绍Linux C++ 开发6 - GDB调试入门指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 1. GDB的介绍
    • 1.1. 什么是GDB?
    • 1.2. 安装GDB
  • 2. 编译带调试信息的程序
    • 2.1. 命令行编译
    • 2.2. makefile编译
    • 2.3. cmake编译
  • 3. GDB使用流程
    • 3.1. 测试源代码准备
    • 3.2. 启动GDB
    • 3.3. 查看源码
    • 3.4. 运行程序
    • 3.5. 设置断点
    • 3.6. 单步执行
    • 3.7. 查看变量
  • 4. GDB常用命令

与Windows下C++开发相比,Linux下C++开发最大的困难就是程序的调试。

Windows下,Visual Studio系列的IDE(Visual Studio 2010/2013/2015/2017/2019/2022)都内置了C++调试引擎,可通过可视化的界面完成调试操作:在IDE里设置调试断点,然后按F5就可以开始调试了,简单又方便。而且功能强大,支持 断点调试、变量查看、单步执行、堆栈跟踪等等。

Linux就没有这么幸运了,没有这么强大可用的可视化工具。Linux下C++的调试,主要又两种方式:

  • 日志打印: 在代码中通过log打印相关的调试信息,程序运行后分享log的数据进行调试。如果你是开发阶段,或者你的程序是一个简单的Demo,也可以直接用std::cout(C++)或printf(C语言)来打印调试信息。
  • GDB调试: GDB是GNU DeBug的缩写,是Linux的调试器。你需要了解GDB工具的常见用法和调试手段。

本文将带领大家一起入门Linux下GDB的调试方法。

1. GDB的介绍

1.1. 什么是GDB?

GDB的全称是GNU DeBugger,它是一个由GNU项目开发的开源调试器,用于调试C和C++程序。GDB允许开发者检查程序的执行过程,设置断点,查看变量值,以及执行其他调试任务,如分析程序崩溃的原因。

GDB支持多种编程语言,包括C、C++、Objective-C、Fortran、Pascal等。通过GDB,开发者可以更有效地诊断和修复代码中的错误,提高开发效率。

1.2. 安装GDB

《Linux C++ 开发1 - 搭建C++开发环境》一文,我们介绍了Linux C++开发环境的搭建,其中包括了安装GDB的步骤。如果你的系统(Ubuntu)还未安装gdb,可以通过以下命令来安装:

# 安装gdb
sudo apt install gdb
# 检查gdb是否安装成功
gdb --version

2. 编译带调试信息的程序

为了能使用GDB进行调试,需要在编译时包含调试信息(即在编译时能够生成调试符号表symbols)。使用-g-ggdb选项进行编译:

2.1. 命令行编译

# -g选项:生成标准的调试信息
g++ -g -o my_program my_program.cpp
# -ggdb选项:生成gdb专用的调试信息
g++ -ggdb -o my_program my_program.cpp
  • -g 选项用于生成标准的调试信息,这些信息可以被多种调试器使用,该选项生成的调试信息符合DWARF(Debugging With Attributed Record Formats)标准,DWARF这是一种通用的调试信息格式。
  • -ggdb 选项专门为GDB生成调试信息。它生成的调试信息可能包含一些GDB特有的扩展,这些扩展可能不适用于其他调试器,不过使用-ggdb选项可以确保生成的调试信息对GDB是最优的。

2.2. makefile编译

# 构建的最终目标 Iterator(可执行文件)
Iterator:Iterator.o Company.o Person.og++ -o Iterator Iterator.o Company.o Person.o
# 构建目标 Iterator.o
Iterator.o:Iterator.cppg++ -g -c Iterator.cpp
# 构建目标 Company.o
Company.o:Company.cppg++ -g -c Company.cpp
# 构建目标 Person.o
Person.o:Person.cppg++ -g -c Person.cpp# 申明clean为伪目标
.PHONY: clean
clean:rm -f *.o Iterator

注意:

  • 是在编译成目标文件.o的时候加上-g选项,而不是在链接的时候加上-g选项。
  • cpp源代码参见 https://gitee.com/spencer_luo/iterator/tree/master/

2.3. cmake编译

# 设置构建类型: Debug/Release
set(CMAKE_BUILD_TYPE Debug)
# 设置编译选项
if(CMAKE_BUILD_TYPE STREQUAL "Debug")# Debug模式,编译是需要保留调试符号表set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -g")
elseif(CMAKE_BUILD_TYPE STREQUAL "Release")# Release模式,编译时优化代码,优化选项:-O2set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
endif()

3. GDB使用流程

3.1. 测试源代码准备

demo02.cpp:

#include <iostream>int add(int a, int b)
{return a + b;
}int division(int a, int b)
{return (int)(a / b);
}int main()
{std::string name = "Spencer";std::cout << "Hello, " << name << "!" << std::endl;int a = 5;int b = 0;int c = division(a, b);int d = add(c, 20);std::cout << "d = " << d << std::endl;return 0;
}

Iterator:

参见源码仓库: https://gitee.com/spencer_luo/iterator/tree/cmake/

3.2. 启动GDB

使用以下命令启动GDB并加载要调试的程序:

# 正常启动,program_name为带符号表的可执行程序
gdb program_name
# quiet, 表示不打印gdb版本等信息,界面较为干净;
gdb -q program_name

测试如下:

gdb ./demo02.out 
GNU gdb (Ubuntu 15.0.50.20240403-0ubuntu1) 15.0.50.20240403-git
Copyright (C) 2024 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:
<https://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:<http://www.gnu.org/software/gdb/documentation/>.<http://www.gnu.org/software/gdb/documentation/>.--Type <RET> for more, q to quit, c to continue without paging--<http://www.gnu.org/software/gdb/documentation/>.--Type <RET> for more, q to quit, c to continue without paging--
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./demo02.out...<http://www.gnu.org/software/gdb/documentation/>.<http://www.gnu.org/software/gdb/documentation/>.<http://www.gnu.org/software/gdb/documentation/>.--Type <RET> for more, q to quit, c to continue without paging----Type <RET> for more, q to quit, c to continue without paging--
--Type <RET> for more, q to quit, c to continue without paging--
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from ./demo02.out...
(gdb)
(gdb) q
gdb -q ./demo02.out
Reading symbols from ./demo02.out...
(gdb)
(gdb) q

3.3. 查看源码

list(缩写l): 查看源程序代码,默认显示10行,按回车键继续看余下的。

file

3.4. 运行程序

run(缩写r) :运行程序直到遇到 结束或者遇到断点等待下一个命令。

file

我们直接运行./demo02.out看到程序崩溃了,但是不知道崩溃在哪一行。但是通过gdb一运行,立马就看出来了。

3.5. 设置断点

break n(缩写b n) :在第n行设置断点。

file

3.6. 单步执行

使用 continue、step、next命令。
在这里插入图片描述

3.7. 查看变量

使用 print、info locals命令。

file

4. GDB常用命令

更多GDB常用命令,将在下一节进行讲解,敬请期待…


大家好,我是陌尘。

IT从业10年+, 北漂过也深漂过,目前暂定居于杭州,未来不知还会飘向何方。

搞了8年C++,也干过2年前端;用Python写过书,也玩过一点PHP,未来还会折腾更多东西,不死不休。

感谢大家的关注,期待与你一起成长。



【SunLogging】
扫码二维码,关注微信公众号,精彩内容

这篇关于Linux C++ 开发6 - GDB调试入门指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1127587

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

linux-基础知识3

打包和压缩 zip 安装zip软件包 yum -y install zip unzip 压缩打包命令: zip -q -r -d -u 压缩包文件名 目录和文件名列表 -q:不显示命令执行过程-r:递归处理,打包各级子目录和文件-u:把文件增加/替换到压缩包中-d:从压缩包中删除指定的文件 解压:unzip 压缩包名 打包文件 把压缩包从服务器下载到本地 把压缩包上传到服务器(zip

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�