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

在 Linux 上调试 C++ 程序

在 Linux 上调试 C++ 程序是一个常见的开发任务,Linux 提供了多种强大的工具来帮助你进行调试。以下是常用的调试方法和工具.

1. 使用 GDB (GNU Debugger)

GDB 是最常用且功能强大的命令行调试器,适用于 C、C++ 和其他语言。它允许你逐步执行代码、设置断点、检查变量值、查看调用栈等。

安装 GDB

大多数 Linux 发行版默认已经安装了 GDB。如果没有,可以通过包管理器安装:

  • Debian/Ubuntu:

    sudo apt-get install gdb
    
  • Fedora/CentOS/RHEL:

    sudo dnf install gdb
    
  • Arch Linux:

    sudo pacman -S gdb
    
编译带有调试信息的程序

为了使 GDB 能够提供详细的调试信息,你需要在编译时添加 -g 选项,以便生成调试符号。

g++ -g -o my_program my_program.cpp
启动 GDB

你可以通过以下方式启动 GDB

  • 直接运行程序

    gdb ./my_program
    
  • 附加到正在运行的进程(如果你需要调试一个已经在运行的程序):

    gdb -p <pid>
    
常用 GDB 命令
  • run [args]: 开始运行程序,传递参数(如果有)。

    (gdb) run arg1 arg2
    
  • break <function>break <file:line>: 设置断点。

    (gdb) break main
    (gdb) break my_function
    (gdb) break my_file.cpp:10
    
  • continuec: 继续执行程序,直到遇到下一个断点或异常。

    (gdb) continue
    
  • steps: 单步执行,进入函数内部。

    (gdb) step
    
  • nextn: 单步执行,不进入函数内部。

    (gdb) next
    
  • print <expression>p <expression>: 打印变量或表达式的值。

    (gdb) print x
    (gdb) print my_object->get_value()
    
  • backtracebt: 显示当前调用栈。

    (gdb) backtrace
    
  • info locals: 显示当前作用域中的局部变量。

    (gdb) info locals
    
  • info args: 显示当前函数的参数。

    (gdb) info args
    
  • watch <expression>: 设置监视点,当表达式的值发生变化时暂停程序。

    (gdb) watch x
    
  • delete <breakpoint-number>: 删除指定编号的断点。

    (gdb) delete 1
    
  • quitq: 退出 GDB。

    (gdb) quit
    
示例:调试一个简单的 C++ 程序

假设你有一个简单的 C++ 程序 main.cpp

#include <iostream>void foo() {int a = 5;int b = 0;int c = a / b;  // 这里会触发除零错误
}int main() {foo();std::cout << "Program finished." << std::endl;return 0;
}
  1. 编译程序

    g++ -g -o my_program main.cpp
    
  2. 启动 GDB

    gdb ./my_program
    
  3. 设置断点并运行程序

    (gdb) break foo
    (gdb) run
    
  4. 单步执行

    (gdb) step
    
  5. 查看变量值

    (gdb) print a
    (gdb) print b
    
  6. 继续执行,直到遇到除零错误

    (gdb) continue
    
  7. 查看调用栈

    (gdb) backtrace
    

2. 使用 Visual Studio Code (VSCode) 调试

VSCode 提供了一个图形化的调试界面,结合 GDB 或 LLDB,可以更方便地调试 C++ 程序。以下是如何在 VSCode 中配置和使用调试器的步骤。

安装必要的扩展
  1. 安装 C/C++ 扩展

    • 打开 VSCode。
    • 点击左侧活动栏中的扩展图标(四个方块组成的图标)。
    • 搜索并安装 C/C++ 扩展(由 Microsoft 提供)。
  2. 安装调试器

    • 对于 GDB,确保系统上已经安装了 gdb
    • 对于 LLDB,确保系统上已经安装了 lldb
配置 launch.json

在项目的根目录下创建 .vscode 文件夹,并在其中创建 launch.json 文件。这个文件用于配置调试器的启动参数。

{"version": "0.2.0","configurations": [{"name": "(gdb) Launch","type": "cppdbg","request": "launch","program": "${workspaceFolder}/my_program",  // 你的可执行文件路径"args": [],  // 传递给程序的参数"stopAtEntry": false,  // 是否在程序入口处停止"cwd": "${workspaceFolder}",  // 工作目录"environment": [],"externalConsole": false,  // 是否在外部终端中运行"MIMode": "gdb",  // 使用的调试器 (gdb 或 lldb)"setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}],"preLaunchTask": "build",  // 可选:在调试前运行的任务(如编译)"miDebuggerPath": "/usr/bin/gdb",  // GDB 的路径"internalConsoleOptions": "neverOpen"}]
}
创建 tasks.json

如果你希望在调试前自动编译程序,可以在 .vscode 文件夹中创建 tasks.json 文件,定义编译任务。

{"version": "2.0.0","tasks": [{"label": "build","type": "shell","command": "g++","args": ["-g","-o","${workspaceFolder}/my_program","${workspaceFolder}/main.cpp"],"group": {"kind": "build","isDefault": true},"problemMatcher": ["$gcc"],"detail": "Generated task to build the program."}]
}
启动调试
  1. 打开 VSCode。
  2. 点击左侧活动栏中的“运行和调试”图标(通常是一个虫子图标)。
  3. 选择你刚刚配置的调试配置(例如 (gdb) Launch)。
  4. 点击绿色的“开始调试”按钮,或者按 F5

3. 使用 LLDB

LLDB 是另一个强大的调试器,最初为 macOS 设计,但现在也广泛支持 Linux。它的命令语法与 GDB 类似,但有一些差异。

安装 LLDB
  • Debian/Ubuntu:

    sudo apt-get install lldb
    
  • Fedora/CentOS/RHEL:

    sudo dnf install lldb
    
  • Arch Linux:

    sudo pacman -S lldb
    
启动 LLDB
lldb ./my_program
常用 LLDB 命令
  • run [args]: 开始运行程序,传递参数(如果有)。

    (lldb) run arg1 arg2
    
  • breakpoint set -n <function>breakpoint set -f <file> -l <line>: 设置断点。

    (lldb) breakpoint set -n main
    (lldb) breakpoint set -f my_file.cpp -l 10
    
  • continuec: 继续执行程序,直到遇到下一个断点或异常。

    (lldb) continue
    
  • steps: 单步执行,进入函数内部。

    (lldb) step
    
  • nextn: 单步执行,不进入函数内部。

    (lldb) next
    
  • print <expression>p <expression>: 打印变量或表达式的值。

    (lldb) print x
    (lldb) print my_object->get_value()
    
  • thread backtracebt: 显示当前调用栈。

    (lldb) thread backtrace
    
  • frame variable: 显示当前帧中的变量。

    (lldb) frame variable
    
  • quitq: 退出 LLDB。

    (lldb) quit
    

4. 使用 Valgrind 检查内存问题

Valgrind 是一个非常有用的工具,专门用于检测内存泄漏、非法内存访问等问题。虽然它不是调试器,但它可以帮助你发现潜在的内存问题。

安装 Valgrind
  • Debian/Ubuntu:

    sudo apt-get install valgrind
    
  • Fedora/CentOS/RHEL:

    sudo dnf install valgrind
    
  • Arch Linux:

    sudo pacman -S valgrind
    
使用 Valgrind
valgrind --leak-check=full ./my_program

Valgrind 会运行你的程序,并在程序结束时输出详细的内存分析报告。你可以根据报告中的提示修复内存泄漏或其他问题。

5. 使用 AddressSanitizer (ASan) 检测内存错误

AddressSanitizer 是一个编译器内置的工具,专门用于检测内存错误,如越界访问、未初始化内存访问等。它比 Valgrind 更快,因为它是在编译时插入检查代码的。

编译时启用 ASan
g++ -fsanitize=address -g -o my_program my_program.cpp
运行程序
./my_program

如果程序中有内存错误,AddressSanitizer 会在运行时输出详细的错误信息。

6. 使用 GProf 分析性能

GProf 是一个简单的性能分析工具,可以帮助你了解程序的性能瓶颈。它通过记录函数调用的时间和频率来生成性能报告。

编译时启用 GProf
g++ -pg -o my_program my_program.cpp
运行程序
./my_program

程序运行后会生成一个名为 gmon.out 的文件,包含性能数据。

生成报告
gprof ./my_program gmon.out > profile.txt

你可以查看 profile.txt 文件,了解哪些函数消耗了最多的时间。

总结

在 Linux 上调试 C++ 程序有多种工具和方法可供选择,具体取决于你的需求:

  • GDB 是最常用的调试器,适合大多数调试场景。
  • VSCode 提供了图形化的调试界面,结合 GDB 或 LLDB,适合喜欢图形化工具的开发者。
  • LLDB 是另一个强大的调试器,尤其适合 macOS 和现代 Linux 系统。
  • ValgrindAddressSanitizer 专注于内存问题的检测,帮助你发现潜在的内存泄漏和非法访问。
  • GProf 用于性能分析,帮助你优化程序的性能。

相关文章:

在 Linux 上调试 C++ 程序

在 Linux 上调试 C 程序是一个常见的开发任务&#xff0c;Linux 提供了多种强大的工具来帮助你进行调试。以下是常用的调试方法和工具. 1. 使用 GDB (GNU Debugger) GDB 是最常用且功能强大的命令行调试器&#xff0c;适用于 C、C 和其他语言。它允许你逐步执行代码、设置断点…...

让跨 project 联查更轻松,SLS StoreView 查询和分析实践

作者&#xff1a;章建&#xff08;处知&#xff09; 概述 日志服务 SLS 是云原生观测和分析平台&#xff0c;为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务。SLS 提供了多地域支持 [ 1] &#xff0c;方便用户可以根据数据源就近接入 SLS 服务&#xff0…...

20240107-类型转换

1. 自动类型转换 不损失数据精度的前提下&#xff0c;可自动完成变量的类型转换&#xff1b;不损失数据精度指不将超出变量可表示范围的值赋给该变量。 2.强制类型转换 若出现精度损失&#xff0c;java不会自动完成类型转换&#xff0c;需强制进行&#xff0c;见下代码的第8…...

关于Linux PAM模块下的pam_listfile

讲《Linux下禁止root远程登录访问》故事的时候&#xff0c;说好会另开一篇讲讲pam_listfile。我们先看看pam_listfile的man文档怎么介绍的。 下面这些就好比人物的简介&#xff0c;甚是恼人&#xff1b;让人看得不明就里&#xff0c;反正“他大舅他二舅都是他舅”。可以直接跳…...

OKHttp调用第三方接口,响应转string报错okhttp3.internal.http.RealResponseBody@4a3d0218

原因分析 通过OkHttp请求网络&#xff0c;结果请求下来的数据一直无法解析并且报错&#xff0c;因解析时String res response.body().toString() 将toString改为string即可&#xff01;...

弱电与电力工程领域,如何通过工程项目管理软件提升效率

在弱电与电力工程领域&#xff0c;通过益企工程云等工程项目管理软件提升效率的方法主要体现在以下几个方面&#xff1a; 1.智能化管理 自动化流程&#xff1a;益企工程云通过自动化处理日常任务和流程&#xff0c;减少手动操作&#xff0c;提高工作效率。 智能预警&#xff…...

引领实时数据分析新时代:阿里云实时数仓 Hologres

在数字化和智能化转型的浪潮中&#xff0c;数据已成为企业决策和运营优化的重要资产。传统的数据仓库解决方案虽然在一定程度上能够帮助企业管理数据&#xff0c;但随着业务需求的不断变化&#xff0c;实时数据处理和高效分析的能力显得愈加重要。为了应对这一挑战&#xff0c;…...

什么是中间件中间件有哪些

什么是中间件&#xff1f; 中间件&#xff08;Middleware&#xff09;是指在客户端和服务器之间的一层软件组件&#xff0c;用于处理请求和响应的过程。 中间件是指介于两个不同系统之间的软件组件&#xff0c;它可以在两个系统之间传递、处理、转换数据&#xff0c;以达到协…...

css中的部分文字特性

文章目录 一、writing-mode二、word-break三、word-spacing;四、white-space五、省略 总结归纳常见文字特性&#xff0c;后续补充 一、writing-mode 默认horizontal-tbwriting-mode: vertical-lr; 从第一排开始竖着排&#xff0c;到底部再换第二排&#xff0c;文字与文字之间从…...

PyQt5 UI混合开发,控件的提升

PromoteLabelTest.py 提升的类 import sys from PyQt5.QtWidgets import QApplication, QWidget,QVBoxLayout,QTextEdit,QPushButton,QHBoxLayout,QFileDialog,QLabelclass PromoteLabel(QLabel):def __init__(self,parent None):super().__init__(parent)self.setText("…...

IP查询于访问控制保护你我安全

IP地址查询 查询方法&#xff1a; 命令行工具&#xff1a; ①在Windows系统中&#xff0c;我们可以使用命令提示符&#xff08;WINR&#xff09;查询IP地址&#xff0c;在弹窗中输入“ipconfig”命令查看本地网络适配器的IP地址等配置信息&#xff1b; ②在Linux系统中&…...

SpringBoot数据层解决方案

文章目录 1. 数据层解决方案2. 数据源技术 1. 数据层解决方案 现有数据层解决方案技术选型&#xff1a;Druid MyBatis-Plus MySQL 数据源&#xff1a;DruidDataSource持久化技术&#xff1a;MyBatis-Plus / MyBatis数据库&#xff1a;MySQL 下面的研究就分为三个层面进行研…...

前端数据模拟器 mockjs 和 fakerjs

功能&#xff1a;帮助前端生成随机数据&#xff0c;独立于后端单独开发 一、mockjs 安装&#xff1a;npm install mockjs 优点&#xff1a;官网是中文。 缺点&#xff1a;目前该库已经无人维护&#xff0c;也没人解决github上的bug。 官网 github地址 二、fakerjs 安装&#xf…...

Python 类 Class

在 Python 中&#xff0c;类&#xff08;Class&#xff09;是一种创建对象&#xff08;Object&#xff09;的模板&#xff0c;它允许我们定义对象的属性和方法。类是 Python 中实现面向对象编程&#xff08;OOP&#xff09;的核心结构。 定义一个类 定义一个类的基本语法如下…...

PHP语言的并发编程

PHP语言的并发编程 引言 随着互联网技术的迅速发展&#xff0c;Web 应用的复杂性和用户并发请求的增加&#xff0c;要求开发者在构建高性能应用时考虑并发编程。并发编程允许程序在同一时间执行多个任务&#xff0c;这对于处理高流量网站、API 和实时应用程序至关重要。虽然 …...

小米智能哑铃上市,代理 IP 视角下的智能健身新篇

在智能科技与健康生活深度融合的时代&#xff0c;小米以其敏锐的市场洞察力和强大的创新能力&#xff0c;不断拓展智能生态版图。米家智能哑铃的发布&#xff0c;无疑是其在智能健身领域的又一重要举措。而当我们从代理 IP 的独特视角来审视这一产品&#xff0c;会发现其中蕴含…...

业务日志设计

当一个项目足够大的时候&#xff0c;我们需要将统计系统完全独立出去&#xff0c;那么就无法避免数据采集的问题&#xff0c;我们可以在业务触发处增加log日志来记录当前变化的原始数据&#xff0c;提供统计系统进行采集 设计一个统计系统的日志记录机制时&#xff0c;主要需要…...

对话|全年HUD前装将超330万台,疆程技术瞄准人机交互“第一屏”

2024年&#xff0c;在高阶智驾进入快速上车的同时&#xff0c;座舱人机交互也在迎来新的增长点。Chat GPT、AR-HUD、车载投影等新配置都在带来新增量机会。 高工智能汽车研究院监测数据显示&#xff0c;2024年1-10月&#xff0c;中国市场&#xff08;不含进出口&#xff09;乘用…...

【论文笔记】QLoRA: Efficient Finetuning of Quantized LLMs

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: QLoRA: Efficient Finetun…...

计算机网络之---物理层的基本概念

物理层简介 物理层&#xff08;Physical Layer&#xff09; 是 OSI&#xff08;开放系统互联&#xff09;模型 中的第 1 层&#xff0c;它主要负责数据在物理媒介上的传输&#xff0c;确保原始比特&#xff08;0 和 1&#xff09;的传输不受干扰地从一个设备传送到另一个设备。…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

从零实现富文本编辑器#5-编辑器选区模型的状态结构表达

先前我们总结了浏览器选区模型的交互策略&#xff0c;并且实现了基本的选区操作&#xff0c;还调研了自绘选区的实现。那么相对的&#xff0c;我们还需要设计编辑器的选区表达&#xff0c;也可以称为模型选区。编辑器中应用变更时的操作范围&#xff0c;就是以模型选区为基准来…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...