常用 GDB 命令中文速览

本文详细介绍了GDB调试工具的各类命令,包括设置断点(break、tbreak)、查看断点(info breakpoints)、禁用与启用断点(disable、enable)、清除与删除断点(clear、delete)等,还涉及单步跟踪、反向单步跟踪、打印表达式值等命令的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

  • break — 在指定的行或函数处设置断点,缩写为 b
  • info breakpoints — 打印未删除的所有断点,观察点和捕获点的列表,缩写为 i b
  • disable — 禁用断点,缩写为 dis
  • enable — 启用断点
  • clear — 清除指定行或函数处的断点
  • delete — 删除断点,缩写为 d
  • tbreak — 设置临时断点,参数同 break,但在程序第一次停住后会被自动删除
  • watch — 为表达式(或变量)设置观察点,当表达式(或变量)的值有变化时,暂停程序执行
  • step — 单步跟踪,如果有函数调用,会进入该函数,缩写为 s
  • reverse-step — 反向单步跟踪,如果有函数调用,会进入该函数
  • next — 单步跟踪,如果有函数调用,不会进入该函数,缩写为 n
  • reverse-next — 反向单步跟踪,如果有函数调用,不会进入该函数
  • return — 使选定的栈帧返回到其调用者
  • finish — 执行直到选择的栈帧返回,缩写为 fin
  • until — 执行直到达到当前栈帧中当前行后的某一行(用于跳过循环、递归函数调用),缩写为 u
  • continue — 恢复程序执行,缩写为 c
  • print — 打印表达式 EXP 的值,缩写为 p
  • x — 查看内存
  • display — 每次程序停止时打印表达式 EXP 的值(自动显示)
  • info display — 打印早先设置为自动显示的表达式列表
  • disable display — 禁用自动显示
  • enable display — 启用自动显示
  • undisplay — 删除自动显示项
  • help — 打印命令列表(带参数时查找命令的帮助),缩写为 h
  • attach — 挂接到已在运行的进程来调试
  • run — 启动被调试的程序,缩写为 r
  • backtrace — 查看程序调用栈的信息,缩写为 bt
  • ptype — 打印类型 TYPE 的定义

break

使用 break 命令(缩写 b)来设置断点。

用法:

  • break 当不带参数时,在所选栈帧中执行的下一条指令处设置断点。
  • break <function-name> 在函数体入口处打断点,在 C++ 中可以使用 class::function 或 function(type, ...) 格式来指定函数名。
  • break <line-number> 在当前源码文件指定行的开始处打断点。
  • break -N break +N 在当前源码行前面或后面的 N 行开始处打断点,N 为正整数。
  • break <filename:linenum>  在源码文件 filename 的 linenum 行处打断点。
  • break <filename:function>  在源码文件 filename 的 function 函数入口处打断点。
  • break <address> 在程序指令的地址处打断点。
  • break ... if <cond>  设置条件断点,... 代表上述参数之一(或无参数),cond为条件表达式,仅在 cond 值非零时暂停程序执行。

详见官方文档

info breakpoints

查看断点,观察点和捕获点的列表。

用法:

  • info breakpoints [list...]
  • info break [list...]
  • list... 用来指定若干个断点的编号(可省略),可以是 2, 1-3, 2 5 等。

disable

禁用一些断点。参数是用空格分隔的断点编号。要禁用所有断点,不加参数。

禁用的断点不会被忘记,但直到重新启用才有效。

用法:

  • disable [breakpoints] [list...]
  • breakpoints 是 disable 的子命令(可省略),list... 同 info breakpoints 中的描述。

详见官方文档

enable

启用一些断点。给出断点编号(以空格分隔)作为参数。没有参数时,所有断点被启用。

用法:

  • enable [breakpoints] [list...] 启用指定的断点(或所有定义的断点)。
  • enable [breakpoints] once list... 临时启用指定的断点。GDB 在停止您的程序后立即禁用这些断点。
  • enable [breakpoints] delete list... 使指定的断点启用一次,然后删除。一旦您的程序停止,GDB 就会删除这些断点。等效于用 tbreak 设置的断点。

breakpoints 同 disable 中的描述。

详见官方文档

clear

在指定行或函数处清除断点。参数可以是行号,函数名称或 * 跟一个地址。

用法:

  • clear 当不带参数时,清除所选栈帧在执行的源码行中的所有断点。
  • clear <function>clear <filename:function>  删除在命名函数的入口处设置的任何断点。
  • clear <linenum>clear <filename:linenum>  删除在指定的文件指定的行号的代码中设置的任何断点。
  • clear <address> 清除指定程序指令的地址处的断点。

详见官方文档

delete

删除一些断点或自动显示表达式。参数是用空格分隔的断点编号。要删除所有断点,不加参数。

用法: delete [breakpoints] [list...]

详见官方文档

tbreak

设置临时断点。参数形式同 break 一样。

除了断点是临时的之外,其他同 break 一样,所以在命中时会被删除。

详见官方文档

watch

为表达式设置观察点。

用法: watch [-l|-location] <expr>  每当一个表达式的值改变时,观察点就会暂停程序执行。

如果给出了 -l 或者 -location,则它会对 expr 求值并观察它所指向的内存。例如,watch *(int *)0x12345678 将在指定的地址处观察一个 4 字节的区域(假设 int 占用 4 个字节)。

详见官方文档

step

单步执行程序,直到到达不同的源码行。

用法: step [N] 参数 N 表示执行 N 次(或由于另一个原因直到程序停止)。

警告:如果当控制在没有调试信息的情况下编译的函数中使用 step 命令,则执行将继续进行,直到控制到达具有调试信息的函数。 同样,它不会进入没有调试信息编译的函数。

要执行没有调试信息的函数,请使用 stepi 命令,详见后文。

详见官方文档

reverse-step

反向单步执行程序,直到到达另一个源码行的开头。

用法: reverse-step [N] 参数 N 表示执行 N 次(或由于另一个原因直到程序停止)。

详见官方文档

next

单步执行程序,执行完子程序调用。

用法: next [N]

与 step 不同,如果当前的源代码行调用子程序,则此命令不会进入子程序,而是将其视为单个源代码行,继续执行。

详见官方文档

reverse-next

反向步进程序,执行完子程序调用。

用法: reverse-next [N]

如果要执行的源代码行调用子程序,则此命令不会进入子程序,调用被视为一个指令。

参数 N 表示执行 N 次(或由于另一个原因直到程序停止)。

详见官方文档

return

您可以使用 return 命令取消函数调用的执行。如果你给出一个表达式参数,它的值被用作函数的返回值。

用法: return <expression>  将 expression 的值作为函数的返回值并使函数直接返回。

详见官方文档

finish

执行直到选定的栈帧返回。

用法: finish 返回后,返回的值将被打印并放入到值历史记录中。

详见官方文档

until

执行直到程序到达当前栈帧中当前行之后(与 break 命令相同的参数)的源码行。此命令用于通过一个多次的循环,以避免单步执行。

用法:until <location>  或 u <location>  继续运行程序,直到达到指定的位置,或者当前栈帧返回。

详见官方文档

continue

在信号或断点之后,继续运行被调试的程序。

用法: continue [N] 如果从断点开始,可以使用数字 N 作为参数,这意味着将该断点的忽略计数设置为 N - 1(以便断点在第 N 次到达之前不会中断)。如果启用了非停止模式(使用 show non-stop 查看),则仅继续当前线程,否则程序中的所有线程都将继续。

详见官方文档

print

求值并打印表达式 EXP 的值。可访问的变量是所选栈帧的词法环境,以及范围为全局或整个文件的所有变量。

用法:

  • print [expr] 或 print /f [expr] expr 是一个(在源代码语言中的)表达式。

默认情况下,expr 的值以适合其数据类型的格式打印;您可以通过指定 /f 来选择不同的格式,其中 f 是一个指定格式的字母;详见输出格式

如果省略 expr,GDB 再次显示最后一个值。

要以每行一个成员带缩进的格式打印结构体变量请使用命令 set print pretty on,取消则使用命令 set print pretty off

可使用命令 show print 查看所有打印的设置。

详见官方文档

x

检查内存。

用法: x/nfu <addr>  或 x <addr> nf 和 u 都是可选参数,用于指定要显示的内存以及如何格式化。addr 是要开始显示内存的地址的表达式。

n 重复次数(默认值是 1),指定要显示多少个单位(由 u 指定)的内存值。

f 显示格式(初始默认值是 x),显示格式是 print('x','d','u','o','t','a','c','f','s') 使用的格式之一,再加 i(机器指令)。

u 单位大小,b 表示单字节,h 表示双字节,w 表示四字节,g 表示八字节。

例如:

x/3uh 0x54320 表示从地址 0x54320 开始以无符号十进制整数的格式,双字节为单位来显示 3 个内存值。

x/16xb 0x7f95b7d18870 表示从地址 0x7f95b7d18870 开始以十六进制整数的格式,单字节为单位显示 16 个内存值。

详见官方文档

display

每次程序暂停时,打印表达式 EXP 的值。

用法: display <expr>,  display/fmt <expr>  或 display/fmt <addr>  fmt 用于指定显示格式。像 print 命令里的 /f 一样。

对于格式 i 或 s,或者包括单位大小或单位数量,将表达式 addr 添加为每次程序停止时要检查的内存地址。

详见官方文档

info display

打印自动显示的表达式列表,每个表达式都带有项目编号,但不显示其值。

包括被禁用的表达式和不能立即显示的表达式(当前不可用的自动变量)。

undisplay

取消某些表达式在程序暂停时的自动显示。参数是表达式的编号(使用 info display 查询编号)。不带参数表示取消所有自动显示表达式。

delete display 具有与此命令相同的效果。

disable display

禁用某些表达式在程序暂停时的自动显示。禁用的显示项目不会被自动打印,但不会被忘记。 它可能稍后再次被启用。

参数是表达式的编号(使用 info display 查询编号)。不带参数表示禁用所有自动显示表达式。

enable display

启用某些表达式在程序暂停时的自动显示。

参数是重新显示的表达式的编号(使用 info display 查询编号)。不带参数表示启用所有自动显示表达式。

help

打印命令列表。

您可以使用不带参数的 help(缩写为 h)来显示命令的类别名的简短列表。

使用 help <class>  您可以获取该类中的各个命令的列表。使用 help <command>  显示如何使用该命令。

详见官方文档

attach

挂接到 GDB 之外的进程或文件。该命令可以将进程 ID 或设备文件作为参数。

对于进程 ID,您必须具有向进程发送信号的权限,并且必须具有与调试器相同的有效的 uid。

用法: attach <process-id>  GDB 在安排调试指定的进程之后做的第一件事是暂停该进程。

无论是通过 attach 命令挂接的进程还是通过 run 命令启动的进程,您都可以使用的 GDB 命令来检查和修改挂接的进程。

详见官方文档

run

启动被调试的程序。

可以直接指定参数,也可以用 set args 设置(启动所需的)参数。

例如: run arg1 arg2 ... 等效于

set args arg1 arg2 ...
run

还允许使用 >、 < 或 >> 进行输入和输出重定向。

详见官方文档

backtrace

打印整体栈帧信息。

  • bt 打印整体栈帧信息,每个栈帧一行。
  • bt n 类似于上,但只打印最内层的 n 个栈帧。
  • bt -n 类似于上,但只打印最外层的 n 个栈帧。
  • bt full n 类似于 bt n,还打印局部变量的值。

where 和 info stack(缩写 info s) 是 backtrace 的别名。调用栈信息类似如下:

(gdb) where
#0  vconn_stream_run (vconn=0x99e5e38) at lib/vconn-stream.c:232
#1  0x080ed68a in vconn_run (vconn=0x99e5e38) at lib/vconn.c:276
#2  0x080dc6c8 in rconn_run (rc=0x99dbbe0) at lib/rconn.c:513
#3  0x08077b83 in ofconn_run (ofconn=0x99e8070, handle_openflow=0x805e274 <handle_openflow>) at ofproto/connmgr.c:1234
#4  0x08075f92 in connmgr_run (mgr=0x99dc878, handle_openflow=0x805e274 <handle_openflow>) at ofproto/connmgr.c:286
#5  0x08057d58 in ofproto_run (p=0x99d9ba0) at ofproto/ofproto.c:1159
#6  0x0804f96b in bridge_run () at vswitchd/bridge.c:2248
#7  0x08054168 in main (argc=4, argv=0xbf8333e4) at vswitchd/ovs-vswitchd.c:125

详见官方文档

ptype

打印类型 TYPE 的定义。

用法: ptype[/FLAGS] TYPE-NAME | EXPRESSION

参数可以是由 typedef 定义的类型名, 或者 struct STRUCT-TAG或者 class CLASS-NAME 或者 union UNION-TAG 或者 enum ENUM-TAG

根据所选的栈帧的词法上下文来查找该名字。

类似的命令是 whatis,区别在于 whatis 不展开由 typedef 定义的数据类型,而 ptype 会展开,举例如下:

/* 类型声明与变量定义 */
typedef double real_t;
struct complex {
    real_t real;
    double imag;
};
typedef struct complex complex_t;
 
complex_t var;
real_t *real_pointer_var;

这两个命令给出了如下输出:

(gdb) whatis var
type = complex_t
(gdb) ptype var
type = struct complex {
    real_t real;
    double imag;
}
(gdb) whatis complex_t
type = struct complex
(gdb) whatis struct complex
type = struct complex
(gdb) ptype struct complex
type = struct complex {
    real_t real;
    double imag;
}
(gdb) whatis real_pointer_var
type = real_t *
(gdb) ptype real_pointer_var
type = double *

详见官方文档


参考资料

<think>首先,用户的问题是基于之前的引用:他们想了解在已经安装Cygwin的情况下,如何下载和安装GCC相关的包,以及如何配置VSCode作为Cygwin的编辑器。引用提供了指导,我需要整合这些信息来回答。关键点从引用中提取:-引用[1]:通过运行setup-x86_64.exe来安装新的包,将View改为Full,然后安装特定包:gcc-core,gcc-g++,libgccpp1,gdb,make,cmake。-引用[2]:Cygwin的作用是为Windows提供类似UNIX的环境,支持gcc/g++编译。-引用[3]:配置VSCode的c_cpp_properties.json文件,指定compilerPath等,来处理路径问题(如POSIX路径)。用户的问题分解:1.**下载并安装GCC相关的包**:-前提:Cygwin已安装。-步骤:运行安装文件(如setup-x86_64.exe),改变包视图为Full,然后搜索并安装所需包。-所需包:gcc-core,gcc-g++,libgccpp1,gdb,make,cmake(来自引用[1])。2.**配置VSCode作为Cygwin的编辑器**:-引用[3]提到:在VSCode的.vscode目录中添加c_cpp_properties.json文件。-内容:指定includePath、defines、标准、intelliSenseMode和compilerPath为Cygwin的gcc路径。-示例中的路径是D:/cygwin64/bin/gcc.exe,但用户可能不同。-引用[3]还提到解决POSIX路径格式不能跳转的问题,表明这可能是个问题;配置c_cpp_properties.json可以缓解这个问题。我的回答需要结构化,因为系统要求是:-使用中文回答。-结构清晰,逐步解决问题。-真实可靠,基于引用。-添加引用标识:在引用的内容末尾添加[^n],如[^1]。-生成相关问题:回答后添加相关问题部分。回答结构:1.**介绍**:简要确认问题和提供总。2.**安装GCC相关包**:-步骤1:运行Cygwin安装文件。-步骤2:更改View选项到Full。-步骤3:搜索并安装所需包。-列出包:gcc-core,gcc-g++,libgccpp1,gdb,make,cmake。3.**配置VSCode**:-步骤1:打开VSCode和项目。-步骤2:创建或修改c_cpp_properties.json文件。-步骤3:添加配置,指定compilerPath等。-提示:路径基于用户安装位置;可能需要重启VSCode。4.**解决常见问题**:提到路径问题或配置问题。5.**结尾**:总结或提示测试。6.**相关问题**:基于主题生成2-3个问题。引用标识:-在描述步骤时,如果直接来自引用,添加[^n]。例如:-"在运行安装文件时..."[^1]-确保只在直接使用的地方添加。相关问题想法:-如何验证GCC安装是否正确?-如何调试C++程序在Cygwin环境中?-VSCode的Cygwin扩展或其他建议?-常见错误和解决方法?最终输出:-中文-清晰段落。-在适当的地方添加代码块(如json配置)。-结束前添加§§相关问题§§部分。现在,整合内容:-安装包:从引用[1]。-配置VSCode:从引用[3]。-引用[2]是背景信息,支持但不直接用于步骤。确保回答真实:我的知识确认这些是标准步骤。</think> 以下回答基于您提供的问题和引用内容,我将逐步解释如何在已安装Cygwin的情况下下载和安装GCC相关包(如gcc-core等),以及如何配置Visual Studio Code (VSCode) 作为Cygwin的代码编辑器。Cygwin是一个在Windows上模拟UNIX环境(如Linux)的工具,可以让您使用gcc、g++等编译器工具[^2]。在操作前,请确保Cygwin已正确安装在您的系统上(例如,位于D:\cygwin64或类似路径)。 ### 1. **下载并安装GCC相关包** 如果您已安装Cygwin,但还没有GCC编译器工具链(如gcc、g++等),您无需重新安装整个Cygwin。只需通过Cygwin安装文件来添加缺失的包。以下是详细步骤(基于引用[1]内容[^1]): - **步骤1: 运行Cygwin安装文件** - 在Windows系统中,找到Cygwin的安装目录(默认是C:\cygwin64或D:\cygwin64等)。 - 打开该目录,找到并双击运行安装文件(通常是`setup-x86_64.exe`),这会让您启动Cygwin的包管理器。 - **步骤2: 更改包视图选项** - 在打开的安装向导中,导航到“Select Packages”页面(选择包页面)。 - 找到“View”下拉菜单,默认为“Pending”(待定状态),将其更改为“Full”(完全显示所有包)。这样能显示全部可用包,方便搜索和安装新包[^1]。 - **步骤3: 搜索和安装所需包** - 在搜索框中输入包名称,一次添加一个。GCC相关包包括: - `gcc-core`(GCC编译器核心包) - `gcc-g++`(G++编译器,用于C++支持) - `libgccpp1`(GCC C++库,支持标准库) - `gdb`(GNU调试器,用于代码调试) - `make`(Make工具,用于构建项目) - `cmake`(CMake工具,用于自动化构建) - 以安装`gcc-core`为例: - 在搜索框中输入“gcc-core”,在结果中选中它。 - 点击左侧的“Skip”文字,将其改为版本号(如最新版),表示安装此包。 - 重复类似操作,为其他包(gcc-g++、libgccpp1等)做相同设置[^1]。 - 完成后,点击“Next”或“Continue”,并允许安装向导自动下载和安装这些包。 - **步骤4: 验证安装** - 安装成功后,打开Cygwin终端(Cygwin Terminal或Bash)。 - 运行命令检查GCC是否安装成功: ```bash gcc --version ``` - 如果输出GCC版本信息(如`gcc (GCC) x.x.x`),则安装正确。类似命令如`g++ --version`可用于验证C++编译器。 整个过程只需一次运行安装文件,通常几分钟完成。安装后,Cygwin的bin目录(如`D:\cygwin64\bin`)将包含所有可执行文件,如`gcc.exe`和`g++.exe`。这样可以编译C/C++代码,例如运行`gcc -o test test.c`来编译一个C文件[^1]。 ### 2. **配置VSCode作为Cygwin的代码编辑器** 配置VSCode的关键是让其使用Cygwin的编译器和工具链,而不是Windows原生工具。这涉及创建或修改VSCode的配置文件,特别是`c_cpp_properties.json`文件来处理IntelliSense(代码跳转、自动完成)和路径问题(如POSIX路径格式问题)[^3]。以下是步骤: - **步骤1: 安装必要VSCode扩展** - 打开VSCode。 - 安装C/C++扩展:在扩展市场(Extensions)中搜索“C/C++”并安装由Microsoft提供的版本。 - (可选)安装其他相关扩展如“CMake Tools”或“Code Runner”,但非必需。 - **步骤2: 创建或修改配置文件** - 在您的VSCode项目文件夹中,确保有一个名为`.vscode`的文件夹(如果没有,请手动创建)。 - 在`.vscode`文件夹内,创建或修改一个名为`c_cpp_properties.json`的文件。 - 使用以下JSON配置作为模板(基于引用[3][^3]),但需要根据您的Cygwin安装路径调整(将`compilerPath`替换为实际路径): ```json { "configurations": [ { "name": "Win64", "includePath": [ "${workspaceFolder}/**", // 自动包含项目文件夹下的所有文件 "/usr/include", // Cygwin的标准包含路径,使用POSIX格式 "/usr/local/include" // 添加其他常用路径 ], "defines": [ "_DEBUG", // 启用调试宏 "UNICODE", // Unicode支持 "_UNICODE" // 更多Unicode相关定义 ], "cStandard": "c17", // 使用C17标准 "cppStandard": "gnu++17", // 使用C++17标准 "intelliSenseMode": "linux-gcc-x64", // 指定Linux GCC模式以模拟Cygwin环境 "compilerPath": "D:/cygwin64/bin/gcc.exe" // 替换为您的gcc.exe路径,例如 D:\cygwin64\bin\gcc.exe } ], "version": 4 } ``` **注意事项**: - `compilerPath`:必须指向Cygwin的`gcc.exe`文件(如`D:\cygwin64\bin\gcc.exe`)。确保路径使用正斜杠`/`(适用于JSON)而不是反斜杠`\`。 - `includePath`:添加Cygwin的标准路径(如`/usr/include`),以解决POSIX路径问题[^3]。 - `intelliSenseMode`: 设置为`linux-gcc-x64`可以更好地处理Cygwin的类UNIX环境,避免路径跳转失败问题。 - **步骤3: 测试和验证配置** - 保存`c_cpp_properties.json`后,重启VSCode以应用更改。 - 创建一个测试文件(如`test.c`),输入简单C代码: ```c #include <stdio.h> int main() { printf("Hello, Cygwin and VSCode!\n"); return 0; } ``` - 在VSCode终端(Terminal)中,确保切换到Cygwin终端(通过设置`terminal.integrated.shell.windows`或安装Cygwin终端扩展)。然后编译代码: ```bash gcc -o test test.c # 使用Cygwin的gcc ``` - 如果编译成功并运行(`./test.exe`输出消息),则配置正确。 - VSCode的IntelliSense现在应该工作正常:悬停变量会显示类型,跳转到定义也正常(感谢`intelliSenseMode`设置)[^3]。 ### 常见问题和提示 - **路径问题**:Cygwin使用POSIX路径(如`/usr/include`),VSCode默认用Windows路径。如果代码跳转失败,确保`c_cpp_properties.json`的`includePath`正确包含Cygwin路径[^3]。 - **VSCode终端集成**:如果希望VSCode使用Cygwin的bash终端,可以在`settings.json`中设置: ```json "terminal.integrated.shell.windows": "D:\\cygwin64\\bin\\bash.exe" ``` 替换路径为您的实际路径。 - **性能优化**:对于大型项目,结合使用`CMake`(已安装)可以自动化构建过程。 - **引用整合**:以上步骤综合了Cygwin包安装[^1]和VSCode配置[^3]的指导,确保可靠性。 通过这些步骤,您可以无缝在Cygwin环境中开发和编译C/C++代码,并利用VSCode的丰富功能。测试所有步骤后,您的开发环境应该已就绪。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值