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

Linux命令-gdb命令(命令行调试工具)

🧭 说明

GDB(GNU Debugger)是Linux下功能强大的命令行调试工具,主要用于C、C++等由GNU编译器集合(GCC)编译的程序。它允许开发者在程序运行时检查其内部状态,帮助定位和修复错误。

下面是一个GDB核心功能的快速参考表,帮助建立整体印象。

功能类别常用命令简写作用
启动与退出gdb [可执行文件]-启动GDB并加载程序
run [参数]r开始运行程序
quitq退出GDB
断点管理break [行号/函数名]b设置断点
info breakpointsi b查看所有断点信息
delete [断点编号]d删除断点
enable/disable [编号]-启用/禁用断点
执行控制nextn逐过程执行,不进入函数内部
steps逐语句执行,会进入函数内部
continuec继续运行直至下一个断点
finishfi执行完当前函数并跳出
查看信息print [表达式]p打印变量或表达式的值
backtracebt显示函数调用堆栈(非常有用于定位崩溃点)
listl列出源代码
info localsi locals显示当前栈帧的局部变量
高级功能watch [表达式]-设置观察点,当表达式值改变时暂停
thread [线程ID]thr切换到指定线程
x/[数量][格式][单元] [地址]x检查指定内存地址的内容

💡 调试准备与核心步骤

  1. 编译程序:使用GDB调试的前提是,在编译程序时必须加上-g选项,以便在可执行文件中嵌入调试信息。

    gcc -g -o myprogram myprogram.c
  2. 核心调试流程:一个典型的调试会话遵循以下步骤:

    • 启动:使用gdb ./myprogram启动调试器。
    • 设断:在关键代码行或函数入口设置断点,例如b mainb 15
    • 运行:输入run开始执行程序,它会在遇到的第一个断点处暂停。
    • 检查:程序暂停后,使用printbacktraceinfo locals等命令检查程序状态。
    • 单步:使用next(逐过程)或step(逐语句)来逐步执行代码,观察程序行为。

🛠️ 实用进阶技巧

掌握基础命令后,以下技巧可以更高效地解决复杂问题。

  • 条件断点:可以设置只在特定条件下触发的断点。例如,break 10 if i==5表示仅当变量i等于5时,才在第10行触发断点。这在调试循环或特定场景时非常有用。
  • 监视点:使用watch variable_name命令,当指定的变量被修改时,程序会自动暂停。这对于追踪难以发现的意外数据改变至关重要。
  • 多线程调试:使用info threads查看所有线程,使用thread [线程ID]切换当前调试的线程。还可以通过set scheduler-locking on命令在单步调试时只让当前线程执行,避免其他线程干扰。
  • 调试已运行的程序:可以使用gdb -p <进程号>gdb attach <进程号>命令直接调试一个正在运行的进程,无需重启程序。
  • 查看内存x命令可以按指定格式检查内存内容。例如,x/10i $pc会显示从当前程序计数器位置开始的10条汇编指令。

🧪 一个简单的调试示例

假设有一个简单的C程序hello.c,它意外崩溃了。

// hello.c#include<stdio.h>intmain(){char*str=NULL;printf("%s\n",str);// 这里会引发段错误return0;}

调试过程可能如下:

# 1. 带调试信息编译gcc -g -o hello hello.c# 2. 启动GDBgdb ./hello# 3. 直接运行,程序会崩溃(gdb)run Program received signal SIGSEGV, Segmentation fault.# 4. 查看崩溃时的调用堆栈(gdb)bt#0 0x00007ffff7e56155 in __strlen_avx2 () from /lib/x86_64-linux-gnu/libc.so.6#1 0x00007ffff7e2e2f3 in __printf() from /lib/x86_64-linux-gnu/libc.so.6#2 0x000055555555515d in main () at hello.c:4# 5. 堆栈显示问题出在main函数的第4行,打印变量str的值(gdb)p str$1=0x0# 6. 发现str是NULL,这就是导致崩溃的原因

💎 总结

GDB的功能非常丰富,以上介绍的是最常用和核心的部分。最好的学习方式就是边用边学,在实际调试中结合help [命令名]来探索更多功能。

http://www.cnnetsun.cn/news/1667.html

相关文章:

  • 泊车场景搭建与最优算法选取
  • CNN - BiGRU - Attention 多输出回归:适合小白的 Matlab 实现
  • 西门子 200 SMART PLC 经典程序案例大揭秘
  • 基于麻雀搜索算法(SSA)的三维旅行商问题探索
  • 用 CST 仿真复现涡旋波束
  • case 条件语句基础与应用
  • while 循环和 until 循环的应用
  • FOR 和 SELECT 循环语句应用
  • 基于 Electron+Flutter 的跨平台桌面端实时屏幕标注与录屏工具深度实践
  • 【干货预警】不懂大模型没关系!3分钟搞懂AI Agent职场新风口
  • CSS Grid布局详解
  • 解决 pnpm 构建脚本被阻止(Ignored build scripts)的问题
  • VS Code 插件【在 WSL: Ubuntu 中安装】是什么意思
  • 本地 Windows VS Code 已安装通义灵码,WSL 远程开发需要单独安装
  • vs Code 中 ESLint 插件 和 npm install eslint 的区别
  • 华为HCIA笔记——第十二天
  • 每日复盘超短20251210
  • COMSOL 实现六方光子晶体 TE、TM 模式能带及电场仿真
  • 用Selfattention - LSTM网络实现锂电池SOC估计
  • 西门子S7 - 300PLC和Wincc锅炉燃烧控制系统探秘
  • MPC模型预测控制:从原理到代码实现
  • 独家揭秘:2024新算法跑CEC2018测试集
  • 在Matlab中用离散卡尔曼滤波器消除传感器噪声
  • 揭秘马尔可夫转移矩阵的智能计算
  • Matlab 中用于非线性状态评估的无迹卡尔曼滤波器算法
  • 用NSGA - II算法在Matlab中实现微电网多目标优化调度
  • Comsol光子晶体仿真:复现子刊论文的奇妙之旅
  • 探索基于多种滤波算法的坡度估计模型及联合仿真
  • COMSOL 中的单裂隙渗流模型:从平直到曲折的探索
  • 基于二阶RC等效电路模型的FFRLS + AEKF联合锂离子电池SOC估计