GDB常用命令

启用GDB调试

想要使用GDB调试应用,首先在编译的时候就要指定使用GDB调试,否则虽然可以调试,但没法在调试窗口直接查看源码、符号、详细的调用栈等,所以,编译是调试的第一步

gcc xx.c -o ngdb      #这是不带有调试信息的
gcc -g xx.c -o ygdb   #加上-g,带调试,且需避免使用编译优化

使用gdb命令运行可执行文件

gdb ./ygdb

此时会进入gdb调试窗口,如果想退出调试,按下q

断点

断点分类

断点类型定义命令格式示例应用场景
行断点在源代码特定行设置断点,程序执行到该行时中断b 文件名:行号b main.c:20调试特定代码行的逻辑错误,如循环中的变量变化
函数断点在函数入口处设置断点,调用该函数时触发b 函数名b calculate_sum快速定位函数调用入口,分析函数参数或内部逻辑
条件断点仅当满足预设条件时触发断点b 行号 if 条件b 20 if x > 100精准控制断点触发逻辑,避免无效中断(如循环中特定迭代)
硬件断点利用CPU硬件特性监控内存/寄存器访问hbreak 地址hbreak *0x4005a0高效监控内存读写或执行,适用于底层调试或性能敏感场景
临时断点触发一次后自动删除,减少断点管理负担tbreak 行号tbreak main一次性调试场景,如初始化代码或单次异常捕获
捕捉断点捕获程序运行中的特定事件(如异常、信号)catch 事件类型catch throw(捕获C++异常)事件驱动调试,如异常处理、库加载/卸载、系统调用
观察断点监控变量值变化(读/写/修改)时触发watch 变量watch x追踪数据被意外修改的场景,如数组越界、全局变量篡改
地址断点在特定内存地址设置断点,常用于汇编级调试b *地址b *0x4005a0底层调试,如分析指令执行流程、内存地址访问
线程断点仅在指定线程执行到断点时触发b 行号 thread 线程IDb 20 thread 1多线程调试,精准定位线程特定行为(如竞态条件)
共享库断点共享库加载/卸载时触发断点break load 库名break load libexample.so动态链接调试,监控库函数调用或插件加载过程
静态断点程序启动前设置断点,确保断点在运行初期生效break 文件名:行号(未运行时)break main.c:10初始化代码调试,如全局变量初始化、构造函数调用
动态断点程序运行时动态设置断点,支持即时调整break 行号(运行时执行)运行时输入b 30即时调试场景,如根据运行时状态动态调整断点位置

断点操作

设置

命令全称缩写用法说明示例
breakb在指定位置设置断点b main.c:20(在main.c第20行设断点)
hbreakhb设置硬件断点(需硬件支持)hb *0x4005a0(在地址0x4005a0设硬件断点)
tbreaktb设置临时断点(触发后自动删除)tb main(在main函数入口设临时断点)
catchc捕获特定事件(如异常、信号)catch throw(捕获C++异常抛出)
watchw设置观察断点(监控变量变化)watch x(监控变量x的变化)
rwatch被读观察点rwatch x
awatch读写观察点awatch x

管理断点

命令全称缩写用法说明示例
enableen启用断点enable 1(启用编号为1的断点)
disabledis禁用断点(保留但暂不触发)disable 2(禁用编号为2的断点)
deleted删除断点d 3(删除编号为3的断点)
clearcl删除指定位置的断点cl main.c:25(删除main.c第25行的断点)

修改断点属性

命令全称缩写用法说明示例
conditioncond设置/修改断点条件cond 1 x>10(设置断点1的条件为x>10)
ignoreig设置断点忽略次数ig 1 5(忽略断点1的前5次触发)
commandscomm设置断点触发时的命令序列comm 1(设置断点1触发时的自定义命令)
siliconsi修改断点的硬件属性(如读写监控)si 1 r(设置断点1监控读取操作)

查看断点

命令全称缩写用法说明示例
info breaki b查看所有断点信息i b(显示所有断点的编号、状态、位置等)
info watchi w查看观察断点信息i w(显示所有观察断点的监控变量及状态)
info catchi c查看捕捉断点信息i c(显示所有捕捉断点的事件类型及状态)

运行控制

文件与基本控制

命令全称缩写用法说明示例
filef加载要调试的可执行文件。GDB 需要知道文件名才能设置断点等。file /path/to/my_program
runr启动被调试的程序。可以跟命令行参数。run arg1 arg2
killk终止正在调试的程序。kill
quitq退出 GDB。quit
set args-设置程序下次 run 时使用的命令行参数。set args -f -o output.txt
show args-显示当前设置的命令行参数。show args
attach-附加到一个正在运行的进程上进行调试。需要进程ID (PID)。attach 12345
detach-从附加的进程上分离,让其继续独立运行。detach
exec-file-加载一个新的可执行文件,用于调试核心转储 (core dump)。exec-file my_program
core-filec加载一个核心转储文件,用于分析程序崩溃时的状态。core-file core.12345

程序运行控制

命令全称缩写用法说明示例
start启动程序并停在main函数入口start
killk终止正在运行的程序kill
runr启动程序并运行,直到遇到断点或程序结束run 或 r(无参数时启动程序)
nextn单步执行,跳过函数调用(执行下一行,不进入函数内部)next 或 n(执行当前行后停在下一行)
nexti执行一条机器指令,不进入函数调用
steps单步执行,进入函数内部(执行下一行,若为函数调用则进入该函数)step 或 s(进入函数内部逐行调试)
stepi执行一条机器级别的指令
continuec继续运行程序,直到遇到下一个断点或程序结束continue 或 c(从当前中断点继续运行)
untilu运行程序直到到达指定行,或跳出当前循环/复杂语句until 30(运行至第30行)或 until(跳出循环)
finishfin执行完当前函数的剩余部分并返回,显示函数返回值finish 或 fin(结束当前函数调试并返回调用点)
jumpj跳转到指定行或地址执行(可能跳过代码或进入无效路径)jump 50(跳转到第50行)或 jump *0x4005a0(跳转到地址0x4005a0)
detachdt分离调试器,让程序继续运行detach
interrupti中断正在运行的程序(类似Ctrl+C)interrupt
returnret从当前函数返回,可指定返回值return 5(返回值为5)
callca调用函数(可带参数)call printf("Hello")
signalsig向程序发送信号signal 2(发送SIGINT)
handlehan设置信号处理方式handle SIGSEGV nostop(不停在SIGSEGV)
threadth切换调试线程thread 2(切换至线程2)
framef切换栈帧frame 1(切换至栈帧1)
upu向栈帧上层移动up
downd向栈帧下层移动down
backtracebt查看调用栈bt
set修改变量的值。set my_var = 100
set follow-fork-modesfm设置子进程调试模式set follow-fork-mode child(跟踪子进程)
set stop-on-solib-eventsssse设置是否在共享库事件时停止set stop-on-solib-events 1(停止)
set paginationsp设置是否分页显示输出set pagination 0(关闭分页)
set argssa设置程序启动参数set args arg1 arg2
set environmentsen设置环境变量set environment VAR=value
set scheduler-lockingssl设置线程调度锁定模式set scheduler-locking on(锁定调度)
set step-modessm设置单步执行模式(如是否进入函数)set step-mode on(进入函数)
set $pcspc修改程序计数器(指令指针)set $pc = 0x4005a0
set $spssp修改栈指针set $sp = 0x7fffffff0000
set $fpsfp修改帧指针set $fp = 0x7fffffff0010
set $pssps修改处理器状态set $ps = 0x2000(设置特定标志位)
set $acsac修改累加器set $ac = 0x1234

调用栈查看

命令全称缩写用法说明示例
backtracebt显示当前的函数调用栈(回溯)。backtrace
framef切换到指定的栈帧。frame 0 是当前帧,frame 1 是调用当前函数的帧。frame 1
info frameinfo f显示当前栈帧的详细信息,包括参数、局部变量和返回地址。info frame
up-向上移动一个栈帧(向 main 函数方向)。up
down-向下移动一个栈帧(远离 main 函数方向)。down
info args-显示当前栈帧的函数参数。info args
info locals-显示当前栈帧的局部变量。info locals

线程调试

命令全称缩写用法说明示例
info threadsinfo t显示所有线程的摘要信息。info threads
threadt切换当前调试的线程。GDB 会显示当前线程号。thread 2
break ... thread <id>-在指定线程中设置断点。b 40 thread 3
info inferiors-显示所有被调试的进程(通常用于调试子进程)。info inferiors
inferior-切换当前调试的进程。inferior 2

源代码查看

命令全称缩写用法说明示例
listl显示源代码。默认显示当前行附近的代码。list
list <function>-显示指定函数的源代码。list main
list <line_num>-显示指定行号附近的源代码。list 50
list <start>, <end>-显示指定行号范围的源代码。list 20, 30
search-在源代码中搜索正则表达式。search my_function
info source-显示当前正在查看的源文件信息。info source
forward-search-向后搜索。forward-search "pattern"
reverse-search-向前搜索。reverse-search "pattern"

数据查看

命令全称缩写用法说明示例
x内存检查(十六进制/ASCII格式)x/4xw &data(检查data地址开始的4个字)
printp
打印变量或表达式的值。
p my_var
p *ptr
p obj.member
ptypept查看变量/类型的定义ptype int(查看int类型定义)或 ptype struct mystruct
whatisw查看表达式类型whatis data(显示data的类型)
disassembledisas反汇编当前函数或指定地址disassemble main(反汇编main函数)或 disas 0x4005a0
inspectins检查对象内存布局inspect obj(显示对象obj的内存结构)
display设置一个表达式,每次程序暂停时自动显示其值。display my_counter
undisplay停止自动显示某个表达式undisplay 1
info display显示所有设置了自动显示的表达式。info display
info registersi r查看所有寄存器状态info registers(显示通用寄存器值)
info threadsi th查看线程列表及状态info threads(显示所有线程ID及当前执行位置)
info stacki s查看调用栈(同backtraceinfo stack 或 bt(显示完整调用栈)
info framei f查看当前栈帧详细信息info frame(显示栈帧基址、返回地址等)
info functions显示所有函数名(可配合 regex)。info functions ^main
info variables显示所有全局/静态变量名。info variables
info localsi l查看当前栈帧的局部变量info locals(列出所有局部变量及值)
info argsi a查看当前函数的参数info args(显示函数参数名及值)
info addri ad查看符号的地址info addr data(显示变量data的内存地址)
info linei li查看源代码行信息info line 20(显示第20行的地址范围及代码)
info filesi f查看目标文件信息info files(显示可执行文件、符号文件路径)
info targeti t查看当前调试目标信息info target(显示目标文件、架构、符号加载状态)
info sharedlibraryi sh查看共享库加载信息info sharedlibrary(显示已加载的共享库及地址范围)
info proci p查看进程信息(内存映射、寄存器等)info proc mappings(显示进程内存映射区域)
info signalsi sig查看信号处理设置info signals(显示信号与处理函数的映射关系)
info typesi ty查看已定义的类型info types(列出所有已定义的结构体、联合体等)
info symboli sy查看地址对应的符号info symbol 0x4005a0(显示该地址对应的函数/变量名)
info addressi ad查看地址对应的符号及段信息info address 0x7fffffff0000(显示地址所在的段及符号)
info catchi c查看捕捉断点信息info catch(显示已设置的异常/事件捕捉断点)
info watchi w查看观察断点信息info watch(显示所有变量监控断点及状态)
info breaki b查看断点信息(同info breakpointsinfo break(显示所有断点编号、位置、状态)
show查看GDB设置参数(与set对应)show pagination(查看是否启用分页模式)
helph查看命令帮助文档help break(显示break命令的详细用法)

GDB环境与设置

命令全称缩写用法说明示例
set-设置 GDB 的各种内部变量。set print pretty on
show-显示 GDB 的内部变量设置。show print pretty
set logging on-开启日志记录,将 GDB 的输出保存到文件。set logging on
set logging off-关闭日志记录。set logging off
set prompt-自定义 GDB 的命令提示符。set prompt (gdb)
set height-设置命令的显示高度,0 表示无限制。set height 0
set width-设置命令的显示宽度。set width 120
source-从文件中读取并执行 GDB 命令。source ~/.gdbinit
helph显示帮助信息。help 显示所有命令分类,help <command> 显示具体命令的帮助。help
help run

非停止模式(Non-Stop Mode)

这是一个高级功能,允许在调试多线程程序时,即使一个线程命中断点,其他线程也可以继续运行。

命令全称缩写用法说明示例
set non-stop on-开启非停止模式。set non-stop on
set non-stop off-关闭非停止模式(默认)。set non-stop off
continue&c&在非停止模式下,让所有线程继续执行。continue&
next&n&在非停止模式下,让当前线程执行下一行。next&
step&s&在非停止模式下,让当前线程步入下一行。step&
interrupt-在非停止模式下,中断所有线程的执行。interrupt
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇
error: Content is protected !!