news 2026/8/18 19:14:33

GDB 使用指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
GDB 使用指南

GDB 官网

https://www.sourceware.org/gdb/

GDB 是什么东西?

GDB, the GNU Project debugger, allows you to see what is going on `inside’ another program while it executes – or what another program was doing at the moment it crashed.
👇
GDB,GNU工程调试器,允许你看到另一个程序在执行时“内部”发生了什么 - 或者另一个程序在崩溃时正在做什么。

GDB can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act:Start your program, specifying anything that might affect its behavior.Make your program stop on specified conditions.Examine what has happened, when your program has stopped.Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.
👇
GDB可以做四种主要的事情(以及支持这些事情的其他事情)来帮助你发现错误:

  • 启动程序,并设置参数。
  • 打断点,在特殊情况下停止。
  • 检查程序停止时发生了什么。(执行到断点停止时,或crash停止时,可以打印当前变量)
  • 更改程序中的内容,以便您可以尝试更正一个错误的影响,并继续了解另一个错误。

GDB 支持哪些语言?

Ada
Assembly
C
C++
D
Fortran
Go
Objective-C
OpenCL
Modula-2
Pascal
Rust

搭建实验环境

  1. 安装 gdb
    yum install gdb 或 apt install gdb
  2. 检查 gdb 是否安装成功
    gdb --version

三种调试方式

  • 调试一个二进制文件 👉 gdb a.out
  • 调试一个正在运行的进程 👉 gdb -p
  • 调试一个挂掉的进程 👉 gdb a.out <core文件>

GDB 命令

GDB 命令共有 12 大类,

类别介绍示例
aliases其它命令的别名ni、tp
breakpoints在某个节点上让程序停止break、disable
data查看数据disassemble、print
files指定并检查文件file、list
internals维护指令(GDB维护人员使用)flushregs、maintenance
obscure模糊的特性compile、record
running运行程序next、run
stack检查堆栈bt、frame
status状态查询info、show
support配套设施if、quit
tracepoints在不停止程序的情况下追踪程序的执行actions、collect
user-defined用户自定义命令

1、运行命令

run:简记为 r ,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。continue(简写c ):继续执行,到下一个断点处(或运行结束) next:(简写 n),单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区别是,step 遇到用户自定义的函数,将步进到函数中去运行,而 next 则直接调用函数,不会进入到函数体内。 step (简写s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的 until:当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。 until+行号: 运行至某行,不仅仅用来跳出循环 finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。 call 函数(参数):调用程序中可见的函数,并传递“参数”,如:call gdb_test(55)quit:简记为 q ,退出gdb

2、断点

breakn (简写b n):在第n行处设置断点 (可以带上代码路径和代码名称: b OAGUPDATE.cpp:578) b fn1ifa>b:条件断点设置breakfunc(break缩写为b):在函数func()的入口处设置断点,如:break cb_button delete 断点号n:删除第n个断点 disable 断点号n:暂停第n个断点enable断点号n:开启第n个断点clear行号n:清除第n行的断点 info b (info breakpoints) :显示当前程序的断点设置情况 delete breakpoints:清除所有断点:

3、查看源码

list :简记为 l ,其作用就是列出程序的源代码,默认每次显示10行。 list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list12list 函数名:将显示“函数名”所在函数的源代码,如:list main list :不带参数,将接着上一次 list 命令的,输出下边的内容。

4、打印表达式

print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。 print a:将显示整数 a 的值 print ++a:将把 a 中的值加1,并显示出来 print name:将显示字符串 name 的值 print gdb_test(22):将以整数22作为参数调用 gdb_test()函数 print gdb_test(a):将以变量 a 作为参数调用 gdb_test()函数 display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display awatch表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如:watcha whatis :查询变量或函数 info function: 查询函数 扩展info locals: 显示当前堆栈页的所有变量

5、查看运行信息

where/bt :当前运行的堆栈列表; bt backtrace 显示当前调用堆栈 up/down 改变堆栈显示的深度setargs 参数:指定运行时的参数 show args:查看设置好的参数 info program: 来查看程序的是否在运行,进程号,被暂停的原因。

6、保存历史命令

编辑 ~/.gdbinit

vim~/.gdbinit

写入:

plaintextsethistorysave onsethistoryfilename ~/.gdb_historysethistorysize2000sethistoryexpansion on

之后退出 gdb 会自动保存命令,下次打开 gdb 上下箭头可以翻历史。

7、分割窗口

layout:用于分割窗口,可以一边查看代码,一边测试: layout src:显示源代码窗口 layout asm:显示反汇编窗口 layout regs:显示源代码/反汇编和CPU寄存器窗口 layout split:显示源代码和反汇编窗口 Ctrl + L:刷新窗口

8、其它功能

shell 执行终端命令,shellls打开日志功能,set loggin on
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/18 19:12:43

Qt新手入门指南 - 如何创建模型/视图(四)

每个UI开发人员都应该了解ModelView编程&#xff0c;本教程的目标是为大家提供一个简单易懂的介绍。 Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xf…

作者头像 李华
网站建设 2026/8/18 19:11:53

怎么创建一个购物程序?UI组件库Kendo UI for Vue可以搞定

Kendo UI致力于新的开发&#xff0c;来满足不断变化的需求。Kendo UI for Vue使用旨在提高性能和丰富用户体验的Vue组件&#xff0c;帮助开发人员构建下一代应用程序。它是为Vue技术框架提供可用的Kendo UI组件&#xff0c;以便更快地构建更好的Vue应用程序。购物程序可以帮助用…

作者头像 李华
网站建设 2026/8/18 19:00:42

C++11 核心特性详解:auto 与范围 for 循环的艺术

在 C11 标准引入的众多特性中&#xff0c;auto关键字和范围 for 循环无疑是最能提升编码效率与代码可读性的两个特性。它们看似简单&#xff0c;却蕴含着现代 C 的设计哲学&#xff0c;既能简化代码&#xff0c;又能在编译期提供更强的类型安全。本文将从基础到进阶&#xff0c…

作者头像 李华
网站建设 2026/8/18 19:00:00

青海西盈广告灯箱片:LED灯箱与超薄灯箱的技术差异在哪?

LED灯箱与超薄灯箱在发光原理和结构设计上存在本质区别&#xff0c;LED灯箱依靠点阵光源发光&#xff0c;而超薄灯箱则采用导光板技术实现均匀面发光。青海西盈广告灯箱片在技术创新中&#xff0c;重点优化了LED光源的排布间距与导光板的微结构设计&#xff0c;以提升光效与均匀…

作者头像 李华