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

相关文章

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

ubuntu如何部署Dify以及安装Docker? Dify安装部署指南

《ubuntu如何部署Dify以及安装Docker?Dify安装部署指南》Dify是一个开源的大模型应用开发平台,允许用户快速构建和部署基于大语言模型的应用,ubuntu如何部署Dify呢?详细请... Dify是个不错的开源LLM应用开发平台,提供从 Agent 构建到 AI workflow 编排、RA

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。

ubuntu16.04如何部署dify? 在Linux上安装部署Dify的技巧

《ubuntu16.04如何部署dify?在Linux上安装部署Dify的技巧》随着云计算和容器技术的快速发展,Docker已经成为现代软件开发和部署的重要工具之一,Dify作为一款优秀的云原生应用... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。它

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

Python MCPInspector调试思路详解

《PythonMCPInspector调试思路详解》:本文主要介绍PythonMCPInspector调试思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录python-MCPInspector调试1-核心知识点2-思路整理1-核心思路2-核心代码3-参考网址

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与