【实用】GDB调试保姆级教程|常用操作|附笔记

GDB调试常用操作

**打断点:**①b 函数名在某个函数出打断点;②b 行号在某行打断点

查看断点: i b

删除断点: d 断点编号

查看断点后会有断点的Num号

复制代码
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000001149 in f at test.c:3
2       breakpoint     keep y   0x0000000000001160 in main at test.c:9
3       breakpoint     keep y   0x000000000000117c in main at test.c:12

运行GDB程序: start程序会停在main 函数入口;run遇到断点时停止

停止后继续运行: c

继续运行、直到遇到下一个断点或程序结束时再停止

单步调试: n向下执行一行代码、不会进入函数体;s向下执行一行代码、会进入函数体;finish跳出函数体

finish 会继续运行直到当前函数返回,并打印函数的返回值

**默认执行上条命令:**什么命令都不输入、直接敲回车、会默认执行上条命令

这条在单步调试时挺方便的

查看变量值: p 变量名打印变量值

查看变量类型: ptype 变量名打印变量类型

帮助文档: help

GDB调试高级操作

设置条件断点: b 10 if 条件

在第10行打一个断点,程序执行到第10行时。只有当条件满足,程序才会停下来

设置断点无效: disable 断点编号

设置断点生效: enable 断点编号

打印函数调用栈: bt

复制代码
(gdb) bt
#0  f () at test.c:3
#1  0x0000555555555172 in main () at test.c:10

注意:调用栈信息记得反过来看!

栈是先进后出的,所以,此时的调用栈的意思是,先调用main再调用f

切换栈帧: f 编号用于在不同的调用堆栈层级之间切换,查看对应层级的局部变量和代码上下文。

eg:f 1 (切换到编号为1的栈帧);f 0 (切回栈顶)

查看寄存器的值: i r

文本用户界面: layout split用于同时显示 源代码汇编代码

快捷键:

Ctrl + X,然后按 A 退出/进入 TUI 模式

Ctrl + X,然后按 O 切换焦点,用于代码窗口命令窗口

Ctrl + L 刷新屏幕,解决花屏问题

查看内存: x /<n><f><u> <address>

  • n: 显示几个单元
  • f: 显示格式 (x=十六进制, d=十进制, c=字符, i=汇编指令)
  • u: 单元大小 (b=byte, h=halfword/2bytes, w=word/4bytes, g=giant/8bytes)

自动显示变量: display 变量名

设置之后,在每次程序暂停时,GDB会自动打印这个变量的值

取消自动显示变量: undisplay 编号

相关推荐
mzhan0171 天前
Linux: lock: preempt_count 是一个线程级别的变量
linux·lock
Dream of maid1 天前
Linux(下)
linux·运维·服务器
齐鲁大虾1 天前
统信系统UOS常用命令集
linux·运维·服务器
大连好光景1 天前
PYG从入门到放弃
笔记·学习
weixin_446023561 天前
C语言:面向过程、应用底层开发、跨平台的通用程序设计语言
c语言·跨平台·数据类型·底层开发·面向过程
ZzzZZzzzZZZzzzz…1 天前
Nginx 平滑升级:从 1.26.3 到 1.28.0,用户无感知
linux·运维·nginx·平滑升级·nginx1.26.3·nginx1.28.0
FreakStudio1 天前
MicroPython LVGL基础知识和概念:底层渲染与性能优化
python·单片机·嵌入式·电子diy
Keep Running *1 天前
Spring Cloud Alibaba_学习笔记
笔记·学习
无敌昊哥战神1 天前
深入理解 C 语言:巧妙利用“0地址”手写 offsetof 宏与内存对齐机制
c语言·数据结构·算法
我不是懒洋洋1 天前
AI的影响6
笔记