Linux GDB 调试
一、初识 GDB
GDB 是一个开源的、功能强大的调试工具,主要用于调试 C、C++ 等语言编写的程序。它支持多种操作系统和架构,能够帮助开发者在程序运行过程中暂停执行、查看变量值、修改程序状态等,从而快速定位和修复问题。
GDB 是 Linux 环境下用于调试 C/C++ 等程序的工具,支持暂停执行、查看变量及修改状态。本文介绍启动 GDB 加载程序或核心转储文件的方法,涵盖函数、行号、地址及条件断点的设置。内容包括运行控制(run、continue)、单步执行(next、step)、调用栈查看(backtrace)及寄存器、变量内存操作。最后汇总了常用命令如 print、info、list 等,帮助开发者快速定位修复问题。

GDB 是一个开源的、功能强大的调试工具,主要用于调试 C、C++ 等语言编写的程序。它支持多种操作系统和架构,能够帮助开发者在程序运行过程中暂停执行、查看变量值、修改程序状态等,从而快速定位和修复问题。
如果你已经编译好了一个程序,可以直接通过以下命令启动 GDB 并加载程序:
gdb <program>
例如,如果你的程序名为 example,则可以输入:
gdb example
GDB 会加载该程序,并进入调试模式。
如果程序需要接收命令行参数,可以使用以下命令启动 GDB:
gdb <program> --args <args>
例如,程序需要接收一个文件路径作为参数,可以这样启动:
gdb example --args input.txt
在 GDB 中,可以通过 run 命令启动程序,并传递参数。
当程序崩溃并生成了核心转储文件时,可以通过以下命令启动 GDB,加载程序和核心转储文件进行调试:
gdb <program> <core>
这可以帮助你分析程序崩溃的原因。
断点是调试过程中非常重要的工具,它可以让程序在指定的位置暂停执行,方便我们查看程序状态。
如果你知道程序在某个函数中可能出现问题,可以使用以下命令在该函数处设置断点:
break <function>
例如,设置在 main 函数处的断点:
break main
程序运行到 main 函数时会暂停。
如果你已经大致知道问题可能出现在代码的哪一行,可以使用以下命令在指定文件的指定行设置断点:
break <filename>:<line>
例如,设置在 example.c 文件的第 10 行的断点:
break example.c:10
程序运行到该行时会暂停。
在某些情况下,你可能需要在指定的内存地址处设置断点,可以使用以下命令:
break *<address>
例如,设置在内存地址 0x1000 处的断点:
break *0x1000
程序运行到该地址时会暂停。
如果你希望断点只有在满足特定条件时才触发,可以使用以下命令设置条件断点:
break <location> if <condition>
例如,设置在 main 函数处的断点,只有当变量 x 的值大于 10 时才触发:
break main if x > 10
这样可以更精准地定位问题。
在 GDB 中,可以通过以下命令开始运行程序:
run <args>
如果你在启动 GDB 时已经指定了程序参数,可以直接输入 run;如果没有指定参数,可以在 run 命令后添加参数。
例如:
run
或者:
run input.txt
程序会从头开始运行,直到遇到断点。
当程序在断点处暂停后,可以通过以下命令从当前断点继续运行:
continue
程序会继续执行,直到遇到下一个断点。
在调试过程中,有时需要逐条语句查看程序的执行情况,可以使用以下命令:
next:执行下一条语句,但不会进入函数内部。如果当前语句是一个函数调用,它会直接跳过该函数,执行下一条语句。next
step:执行下一条语句,并进入函数内部。如果当前语句是一个函数调用,它会进入该函数,继续逐条语句执行。step
通过这两种方式,可以灵活地查看程序的执行流程。
如果你当前处于一个函数内部,可以通过以下命令执行完当前函数并返回:
finish
程序会继续执行,直到当前函数执行完毕并返回。
在调试过程中,如果需要终止程序的运行,可以使用以下命令:
kill
程序会被强制终止。
在 GDB 中,可以通过以下命令查看当前代码位置附近的代码:
list
默认情况下,它会显示当前代码位置附近的 10 行代码。如果需要查看其他部分的代码,可以在 list 命令后指定文件名和行号:
list <filename>:<line>
例如:
list example.c:20
这可以帮助你快速定位代码位置。
可以通过以下命令查看所有设置的断点信息:
info breakpoints
它会列出所有断点的编号、位置、条件等信息,方便你管理断点。
当你处于某个函数的断点处时,可以通过以下命令查看当前函数的参数和局部变量:
info args:查看当前函数的参数。info args
info locals:查看当前函数的局部变量。info locals
这可以帮助你了解函数的输入和内部状态。
在某些情况下,你可能需要查看寄存器的内容,可以通过以下命令:
info registers
它会列出所有寄存器的名称和当前值,这对于底层调试非常有帮助。
当程序出现异常时,查看调用栈可以帮助你了解程序的执行路径。可以通过以下命令查看调用栈:
backtrace
或者简写为:
bt
它会从当前栈帧开始,向上列出所有调用栈帧的信息,包括函数名、文件名、行号等。
如果你需要查看调用栈中某个特定栈帧的信息,可以通过以下命令切换到该栈帧:
frame <n>
其中 <n> 是栈帧的编号。例如,切换到编号为 2 的栈帧:
frame 2
然后可以使用 info args、info locals 等命令查看该栈帧的参数和局部变量。
在调试过程中,可以通过以下命令打印变量的值:
print <variable>
例如,打印变量 x 的值:
print x
GDB 会显示变量的当前值。
如果需要查看内存中的内容,可以通过以下命令:
x/<n><format><address>
<n> 表示要显示的内存单元数量。<format> 表示显示格式,例如 x 表示十六进制,d 表示十进制,c 表示字符等。<address> 表示内存地址。例如,查看从地址 0x1000 开始的 10 个字节的十六进制内容:
x/10x 0x1000
这可以帮助你查看内存的布局和数据。
在某些情况下,你可能需要修改变量的值,可以通过以下命令:
set variable = value
例如,将变量 x 的值修改为 20:
set x = 20
然后可以继续运行程序,观察程序行为的变化。
完成调试后,可以通过以下命令退出 GDB:
quit
或者:
exit
gdb:启动 GDB 并加载要调试的程序。gdb <program> <core>:加载程序和核心转储文件进行调试。gdb --args:加载程序并传递参数。break:在指定函数处设置断点。break <filename>:<line>:在指定文件的指定行设置断点。break *<address>:在指定内存地址处设置断点。break <location> if <condition>:设置条件断点,只有满足条件时才会触发。run:开始运行程序,并传递参数。continue:从当前断点继续运行程序。next:执行下一条语句(跳过函数调用)。step:进入函数内部执行。finish:执行完当前函数并返回。kill:终止正在运行的程序。disable breakpoints:指令用于禁用已设置的断点。enable breakpoints:指令用于重新启用之前被禁用的断点。display 变量名:跟踪查看一个变量,每次停下来都显示它的值。undisplay:取消对先前设置的那些变量的跟踪。delete breakpoints:删除所有断点。set var:修改变量的值。delete breakpoints n:删除序号为 n 的断点。list:显示当前代码位置附近的代码。info breakpoints:显示所有断点信息。info args:显示当前函数的参数。info locals:显示当前函数的局部变量。info registers:显示寄存器的内容。backtrace 或 bt:显示调用栈。frame:切换到指定的调用栈帧。print:打印变量的值。print *:打印指定地址的内容。set:修改变量的值。x/:查看内存内容,例如 x/10gx 0x1000 查看 10 个 8 字节的内容。handle stop:让 GDB 在接收到指定信号时暂停程序。handle nostop:让 GDB 不在接收到指定信号时暂停程序。quit 或 exit:退出 GDB。其他
help:显示帮助信息。help <command>:显示指定命令的帮助信息。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online