龙空技术网

GDB实战指南:18个调试技巧,快速解决程序问题

互联网技术洞察 418

前言:

如今咱们对“如何调试c程序”大致比较重视,你们都需要了解一些“如何调试c程序”的相关文章。那么小编同时在网上搜集了一些关于“如何调试c程序””的相关内容,希望咱们能喜欢,看官们一起来了解一下吧!

GDB(GNU Debugger)是一款强大的调试工具,可以帮助开发者定位和修复程序中的错误。通过学习GDB的常用调试命令,我们可以更高效地进行程序调试,提高开发效率。本文将介绍18个常用的GDB调试技巧,助你快速掌握GDB的使用技巧。

一 GDB简介

GDB,全称为GNU Debugger,是一个由GNU开源组织发布的、基于命令行的、功能强大的程序调试工具。它主要用于调试C、C++等语言编写的程序,最初由理查德·马修·斯托曼(Richard Stallman)在1988年编写,并以GNU通用公共许可证(GNU General Public License)的方式发布,因此是自由软件。GDB主要用于程序的调试,可以帮助开发者检查程序的运行状态、查看变量的值、设置断点等,从而定位和修复程序中的错误。GDB对于嵌入式软件开发工程师来说是基本技能之一,通常用于Linux操作系统下的软件开发。

二 GDB常用命令

本文演示GDB命令,所用的代码如下:

2.1 设置断点

可以在函数名和行号等上设置断点。程序运行后,到达断点就会自动暂停运行。此时可以查看该时刻的变量值、显示栈帧、重新设置断点或重新运行等。断点命令(break)可以简写为b。

格式

举例

设置好的断点可以通过info break 确认

2.2 显示栈帧

backtrace命令可以在遇到断点而暂停执行时显示栈帧。该命令简写为bt。此外, backtrace的别名还有where和info stack(简写为info s)。

显示所有栈帧

只显示开头N个栈帧

只显示最后N个栈帧

举例

2.3 显示变量

格式

举例

2.4 显示寄存器

举例

寄存器前加$,可以显示寄存器的内容。

显示寄存器可以用以下格式

p/格式 变量

2.5 显示内存

x命令可以显示内存的内容

格式

举例

x/i 可以显示汇编指令。一般用x命令时,格式为x/NFU ADDR。此处ADDR为希望显示的地址,N为重复次数。F为前面讲过的格式,u代表的单位如下。

下面显示从rsp开始的10条指令。

2.6 显示反汇编

格式

格式1为反汇编当前整个函数,2为反汇编程序计数器所在函数的整个函数。3为反汇编从开始地址到结束地址的部分。

2.7 单步执行2.8 继续运行

指定次数可以忽略断点,例如,continue 5 则5次遇到断点不会停止,第6次遇到断点才会停止。

2.9 监视点

格式

<表达式>发生变化时暂停运行,<表达式>意思是常量或变量

<表达式>被访问,改变时暂停运行

<表达式>被访问时暂停运行

举例

删除断点和监视点

<编号>指的是断点或监视点

举例

2.10 改变变量的值

格式

举例

2.11 生成内核转储文件

有了内核转储文件,即使退出了GDB也能查看生成转储文件时的运行历史。

该命令无需停止正在运行的程序,可以直接从命令行直接生成转储文件。当需要在其他机器上单独分析问题原因时,或者是分析客户现场问题时十分有用。

2.12 条件断点

如果条件为真,则暂停运行

第一条指令删除指定断点编号的触发条件,第二条指令给断点添加触发条件

2.13 反复执行

在编号指定的断点,监视点忽略指定的次数

continue与ignore一样,也可以指定次数,达到指定次数前,执行到断点时不暂停。

finish 执行完当前函数后暂停,until命令执行完当前函数等代码块后暂停,常用于跳出循环。

2.14 删除断点或禁用断点

clear 用于删除已定义的断点

disable 临时禁用断点。第3种格式禁用display命令定义的自动显示,第4种格式禁用mem命令定义的内存区域。

once 使指定的断点只启用一次。delete表示在运行暂停后删除断点。

2.15 断点命令

格式

程序在指定的断点处暂停,就会自动执行命令。

举例

上例表示在17行暂停后打印c的值。

与前面的条件断点组合使用,可以在断点暂停时执行复杂的动作。

举例

2.16 值的历史

通过print命令显示过的值会记录在内部的值历史中,这些值可以在其他表达式中使用。

举例

最后的值可以使用$ 访问。

通过show values 可以显示历史中的最后10个值

举例

值的历史的访问变量和说明

可以随意定义变量。变量以$开头,有英文和数字组成。

举例

2.17 命令历史

可以把命令保存在文件中,保存命令历史后,就可以在其他调试会话中使用。默认命令历史文件位于./.gdb_history

可以使用csh风格的!字符

可将命令历史保存到文件中,可以通过环境变量GDBHISTFILE改变默认文件。

启用命令历史保存到文件和恢复的功能。

设置保存到命令历史中的命令数量,默认为256。

2.18 命令定义

用define可以自定义命令,用document可以给自定义的命令加说明,利用help 命令名可以查看定义的命令。

define格式:

document格式:

help格式:

以下示例定义了名为li的命令

还可以把各种设置写在文件中,运行调试器时读取这些文件。

三 GDB常用命令缩写四 参考资料

[1] gdb-dashborad:git@github.com:cyrus-and/gdb-dashboard.git

[2]100个gdb小技巧:

[3]GDB使用总结:

[4]GDB官网:

标签: #如何调试c程序