【Linux】GDB调试指南

一、GDB基础 

1. 启动调试

gdb ./your_program       # 启动调试
gdb --args ./prog arg1   # 带参数启动
gdb -p <pid>             # 附加到正在运行的进程

 2. 断点管理

b main            # 在main函数设断点
b file.c:20       # 在file.c第20行设断点
b *0x4005a0       # 在内存地址设断点
info breakpoints  # 查看所有断点
delete <num>      # 删除断点
disable/enable <num> # 禁用/启用断点
3. 执行控制
run               # 启动程序
continue (c)      # 继续执行到下一个断点
next (n)          # 单步执行(跳过函数)
step (s)          # 单步进入函数
finish            # 执行完当前函数并返回
until <line>      # 执行到指定行

 4. 查看变量和内存

print (p) x       # 打印变量x
p *ptr@10         # 打印ptr指向的10个元素
p/x var           # 十六进制格式打印
x/4xg 0x4000      # 查看内存:4个8字节十六进制值
info registers    # 查看寄存器值

二、GDB进阶 

1. 加载可执行程序和core dump文件

#include <stdio.h>int main(void) {int *p = NULL;printf("hello world\n");*p = 0;return 0;
}

例子程序访问了一个空指针,所以程序会crash并产生core dump文件。用gdb调试core dump文件,通常用这个命令形式:

gdb path/to/the/executable path/to/the/coredump

然后gdb会显示程序crash的位置。

2. 调试正在运行的进程

# 查找目标进程PID
ps aux | grep 程序名# 附加调试
gdb -p <PID>
(gdb) bt                 # 查看当前调用栈
(gdb) info threads       # 查看所有线程
(gdb) thread <ID>        # 切换线程
(gdb) frame <N>          # 选择栈帧
(gdb) p variable         # 打印变量

三、其他问题 

1. 怎么debug,怎么看内存泄漏。

2. gdb 使用 -> 多线程程序切换到某线程栈帧 -> 如何查看寄存器值

# 在malloc/free处设断点
(gdb) break malloc
(gdb) break free# 记录所有内存分配
(gdb) set logging file mem.log
(gdb) set logging on# 运行后对比malloc/free调用次数
(gdb) info breakpoints

3. 怎么分析C++的core文件

启用core dump生成:

# 临时生效(当前会话)
ulimit -c unlimited  # 解除大小限制
echo "/tmp/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern  # 设置存储路径# 永久生效(需root)
echo "ulimit -c unlimited" >> /etc/profile
echo "/tmp/core.%e.%p" > /etc/sysctl.d/core.conf
sysctl -p /etc/sysctl.d/core.conf
g++ -g -O0 -rdynamic -o program program.cpp  # 必须包含-g选项

 加载core文件

gdb ./program /tmp/core.1234  # program是崩溃的可执行文件

查看崩溃位置:

(gdb) bt full  # 显示完整调用栈(包含局部变量)
(gdb) frame N  # 切换到指定栈帧(N为bt显示的编号)
(gdb) list     # 显示崩溃点附近的源代码

 

4. GDB有哪些命令

1. 启动与退出
命令说明
gdb ./program启动GDB调试程序
run [args]运行程序(可带参数)
quit退出GDB
2. 断点管理
命令说明
break main在main函数设断点
break file.cpp:20在指定文件的第20行设断点
break *0x4005a0在内存地址设断点
info breakpoints查看所有断点
delete 2删除编号为2的断点
disable/enable 1禁用/启用编号1的断点
3. 执行控制
命令说明
next (n)单步执行(不进入函数)
step (s)单步进入函数
continue (c)继续执行到下一个断点
finish执行完当前函数并暂停
until 30运行到第30行
4. 变量与内存
命令说明
print x打印变量x的值
print *ptr@10打印指针ptr指向的10个元素
x/4xw 0x4000以16进制显示内存(4个word)
info registers查看所有寄存器值
info locals显示当前栈帧的局部变量
5. 调用栈与线程
命令说明
backtrace (bt)查看调用栈
frame 2切换到调用栈第2帧
info threads查看所有线程
thread 3切换到线程3
 6. 多进程/线程调试
命令说明
set follow-fork-mode child调试子进程
set scheduler-locking on锁定当前线程
thread apply all bt打印所有线程的调用栈
7. 实用辅助命令
命令说明
set logging on记录调试输出到文件
define hook-run定义启动时自动执行的命令
shell ls执行shell命令
help [command]查看命令帮助

 

5. gcc和g++的区别

特性gcc (GNU C Compiler)g++ (GNU C++ Compiler)
默认语言标准C11 (可通过 -std= 指定其他版本)C++17 (可通过 -std= 指定其他版本)
链接阶段行为默认不链接 C++ 标准库自动链接 libstdc++ (C++ 标准库)
文件扩展名处理将 .c 文件视为 C 代码将 .cpp/.cxx 视为 C++,.c 仍视为 C

6. Linux下程序有问题,如何调试?(答GDB打开,打上Breakpoint进行调试)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android面试总结之Glide源码级理解

当你的图片列表在低端机上白屏3秒、高端机因内存浪费导致FPS腰斩时&#xff0c;根源往往藏在Glide的内存分配僵化、磁盘混存、网络加载无优先级三大致命缺陷中。 本文从阿里P8级缓存改造方案出发&#xff0c;结合Glide源码实现动态内存扩容、磁盘冷热分区、智能预加载等黑科技&…

驱动开发系列49 - 搭建 Vulkan 驱动调试环境(编译 mesa 3D)- Ubuntu24.04

一:搭建Vulkan运行环境 安装vulkan依赖包: 1. sudo apt install vulkan-tools 2. sudo apt install libvulkan-dev 3. sudo apt install vulkan-utility-libraries-dev spirv-tools 4. sudo apt install libglfw3-dev libglm-dev 5. sudo apt install libxxf86vm-dev libxi-…

深度学习——图像余弦相似度

计算机视觉是研究图像的学问&#xff0c;在图像的最终评价时&#xff0c;往往需要用到一些图像相似度的度量指标&#xff0c;因此&#xff0c;在本文中我们将详细地介绍原生和调用第三方库的计算图像余弦相似度的方法。 使用原生numpy实现 import numpy as npdef image_cosin…

项目代码第8讲【数据库基础知识】:SQL(DDL、DML、DQL、DCL);函数(聚合、字符串、数值、日期、流程);约束;多表查询;事务

黑马程序员 MySQL数据库入门到精通&#xff0c;从mysql安装到mysql高级、mysql优化全囊括_哔哩哔哩_bilibili 一、数据库相关概念 1、主流的关系型数据库都支持SQL语言——SQL语言可以操作所有的关系型数据库 像MySQL、Oracle Database、Microsoft SQL Server、IBM Db2等主流的…

如何在阿里云linux主机上部署Node.Js

在阿里云的Linux服务器上搭建Node.js编程环境可以通过以下步骤完成。这里以常见的 Ubuntu/CentOS 系统为例&#xff0c;提供两种安装方式&#xff08;包管理器、NVM多版本管理&#xff09;&#xff1a; 一、通过包管理器安装&#xff08;适合快速安装指定版本&#xff09; 1. …

Python爬虫:开启数据抓取的奇幻之旅(一)

目录 一、爬虫初印象&#xff1a;揭开神秘面纱​ 二、工欲善其事&#xff1a;前期准备​ &#xff08;一&#xff09;Python 环境搭建​ 1.下载 Python 安装包&#xff1a;​ 2.运行安装程序&#xff1a;​ 3.配置环境变量&#xff08;若自动添加失败&#xff09;&#x…

机器学习——集成学习框架(GBDT、XGBoost、LightGBM、CatBoost)、调参方法

一、集成学习框架 对训练样本较少的结构化数据领域&#xff0c;Boosting算法仍然是常用项 XGBoost、CatBoost和LightGBM都是以决策树为基础的集成学习框架 三个学习框架的发展是&#xff1a;XGBoost是在GBDT的基础上优化而来&#xff0c;CatBoost和LightGBM是在XGBoost的基础上…

第十五章:Python的Pandas库详解及常见用法

在数据分析领域&#xff0c;Python的Pandas库是一个不可或缺的工具。它提供了高效的数据结构和数据分析工具&#xff0c;使得数据处理变得简单而直观。本文将详细介绍Pandas库的基本功能、常见用法&#xff0c;并通过示例代码演示如何使用Pandas进行数据处理。最后&#xff0c;…

【Python桌面应用】PySide6 界面开发完全指南

文章目录 1. 引言2. PySide6 简介与安装2.1 什么是PySide62.2 PySide6 vs. PyQt62.3 安装PySide62.4 开发环境配置建议 3. Qt 设计原理3.1 Qt对象模型3.2 信号与槽机制3.3 Qt坐标系统3.4 Qt样式表(QSS) 4. 创建第一个应用4.1 基本应用结构4.2 主窗口与应用生命周期4.3 使用面向…

用 pytorch 从零开始创建大语言模型(三):编码注意力机制

从零开始创建大语言模型&#xff08;Python/pytorch &#xff09;&#xff08;三&#xff09;&#xff1a;编码注意力机制 3 编码注意力机制3.1 建模长序列的问题3.2 使用注意力机制捕捉数据依赖关系3.3 通过自注意力关注输入的不同部分3.3.1 一个没有可训练权重的简化自注意力…

Spring中的IOC及AOP概述

前言 Spring 框架的两大核心设计思想是 IOC&#xff08;控制反转&#xff09; 和 AOP&#xff08;面向切面编程&#xff09;。它们共同解决了代码耦合度高、重复逻辑冗余等问题。 IOC&#xff08;控制反转&#xff09; 1.核心概念 控制反转&#xff08;Inversion of Control…

STM32_HAL开发环境搭建【Keil(MDK-ARM)、STM32F1xx_DFP、 ST-Link、STM32CubeMX】

安装Keil(MDK-ARM)【集成开发环境IDE】 我们会在Keil(MDK-ARM)上去编写代码、编译代码、烧写代码、调试代码。 Keil(MDK-ARM)的安装方法&#xff1a; 教学视频的第02分03秒开始看。 安装过程中请修改一下下面两个路径&#xff0c;避免占用C盘空间。 Core就是Keil(MDK-ARM)的…

python 第三方库 - dotenv读取配置文件

.env 文件是一种用于存储环境变量的配置文件&#xff0c;常用于项目的运行环境设置。环境变量是操作系统层面的一些变量&#xff0c;它们可以被应用程序访问和使用&#xff0c;通常包含敏感信息或特定于环境的配置&#xff0c;如数据库连接信息、API 密钥、调试模式等。 安装p…

用python压缩图片大小

下载库 cmd开命令或者PyCharm执行都行 pip install pillow2. 然后就是代码 from PIL import Imagedef compress_image(input_path, output_path, quality85, max_sizeNone):"""压缩图片大小。参数:- input_path: 输入图片路径- output_path: 输出图片路径- qu…

【自用记录】本地关联GitHub以及遇到的问题

最近终于又想起GitHub&#xff0c;想上传代码和项目到仓库里。 由于很早之前有在本地连接过GitHub&#xff08;但没怎么用&#xff09;&#xff0c;现在需要重新搞起&#xff08;操作忘得差不多&#xff09;。 在看教程实操的过程中遇到了一些小问题&#xff0c;遂记录一下。 前…

在一个scss文件中定义变量,在另一个scss文件中使用

_variables.scss文件 : $line-gradient-init-color: linear-gradient(90deg, #8057ff 0%, #936bff 50%, #b892ff 100%); $line-gradient-hover-color: linear-gradient(90deg, #936bff 0%, #b892ff 50%, #f781ce 100%); $line-gradient-active-color: linear-gradient(90deg, …

从零开始研发GPS接收机连载——19、自制GPS接收机的春运之旅

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 从零开始研发GPS接收机连载——19、自制GPS接收机的春运之旅 许久未曾更新这个系列&#xff0c;并非我平日里对这事儿没了兴致&#xff0c;不再愿意折腾。实则是受限于自身条…

智能驾驶功能LCC车道保持居中

画龙现象就是LCC常见bug LDW车道偏离预警 LKA车道保持 声音其实就是蜂鸣器 有些车是40 有些是60

Java全栈面试宝典:线程机制与Spring依赖注入深度解析

目录 一、Java线程核心机制 &#x1f525; 问题3&#xff1a;start()与run()的底层执行差异 线程启动流程图解 核心差异对照表 代码验证示例 &#x1f525; 问题4&#xff1a;Thread与Runnable的六大维度对比 类关系UML图 最佳实践代码 &#x1f525; 问题5&#xff1…

使用ANTLR4解析Yaml,JSON和Latex

文章目录 ANTLR4基本使用**1. 安装 Java 运行时&#xff08;必需&#xff09;****2. 安装 ANTLR4 命令行工具****方法一&#xff1a;通过包管理器&#xff08;推荐&#xff09;****macOS/Linux (Homebrew)****Windows (Chocolatey)** **方法二&#xff1a;手动安装&#xff08;…