gdb 常用指令
gdb 常用指令1. 功能描述GDBGNU Debugger是 Linux 下最常用的 C/C 调试器支持断点调试、变量查看、调用栈追踪、内存检查、多线程调试、远程调试和 Core Dump 分析。1.1 核心能力能力说明断点调试行断点、函数断点、条件断点、临时断点、硬件断点单步执行step进入函数、next跳过函数、finish跳出函数变量查看打印变量值、结构体展开、数组/指针内容、自动显示调用栈分析查看调用栈、切换栈帧、查看局部变量和参数内存/寄存器按地址查看内存内容、查看/修改寄存器值多线程调试线程切换、线程级断点、查看所有线程栈远程调试gdbserver 方式调试嵌入式/远程目标Core Dump分析程序崩溃后生成的 core 文件还原崩溃现场2. 调试前准备编译时必须加-g生成调试信息建议关闭优化-O0避免变量被优化掉gcc-g-O0main.c-omain# 单文件g-g-O0main.cpp-omain# Ccmake-Bbuild-DCMAKE_BUILD_TYPEDebug# CMake 项目3. 启动与退出3.1 启动 gdbgdb program# 直接启动gdb--argsprogram arg1 arg2# 带参数启动gdb-pPID# 附加到运行中的进程gdb program core.12345# 分析 Core Dumpgdb program-ccore.12345# 同上另一种写法启动后可设置参数set args arg1 arg2 # 设置程序参数 show args # 查看当前参数3.2 退出 gdbquit # 简写 q退出 gdb4. 运行控制命令简写说明runr从头开始运行程序start—开始执行并在 main 入口暂停continuec继续执行到下一个断点nextn单步执行不进入函数内部steps单步执行进入函数内部finishfin执行到当前函数返回untilu运行到指定行等价于临时一次性断点killk终止正在调试的程序run file—重定向输出到文件5. 断点管理5.1 设置断点命令说明b 10当前文件的第 10 行b main.c:20指定文件的行b func函数入口b *addr指定地址如b *0x400500b 5当前执行位置往后 5 行b -5当前执行位置往前 5 行tb func临时断点命中一次后自动删除hbreak func硬件断点适用 ROM 中调试5.2 条件断点命令说明b 10 if i 5第 10 行条件成立才暂停b func if x 100函数入口条件断点b main.c:20 if strcmp(s, “err”) 0字符串条件condition 2 i 5给 2 号断点追加/修改条件condition 2移除 2 号断点的条件5.3 管理断点命令说明info b查看所有断点含编号、类型、命中次数enable启用所有断点enable 2启用 2 号断点enable once 2启用 2 号断点命中一次后禁用enable delete 2启用 2 号断点命中后删除disable禁用所有断点disable 2禁用 2 号断点d删除所有断点d 2删除 2 号断点ignore 2 10跳过 2 号断点前 10 次命中save breakpoints file保存断点到文件source file从文件恢复断点5.4 监视点命令说明watch var变量被写入时暂停rwatch var变量被读取时暂停awatch var变量被读写时均暂停info watch查看所有监视点监视点与断点共享同一编号空间管理命令相同enable/disable/delete。6. 查看信息6.1 查看变量命令简写说明print varp var打印变量值p /x var—十六进制打印p /t var—二进制打印p /c var—字符打印p /f var—浮点打印p /a var—打印地址p *ptr—解引用指针p *ptr10—打印指针指向的 10 个元素数组p sizeof(var)—打印变量大小p strlen(str)—调用函数前提编译带了足够符号信息set var value—修改变量值display var—每次停顿时自动打印变量undisplay 编号—取消自动显示info display—查看所有自动显示项info locals—查看当前栈帧所有局部变量info args—查看当前函数参数6.2 查看内存命令说明x /4xb addr按十六进制字节显示 4 个单元x /10xw addr按十六进制字4 字节显示 10 个单元x /s addr以字符串形式显示x /i addr以汇编指令形式显示格式x /NFU addr—— N数量F格式(x/d/o/t/s/i)U单位(b/h/w/g1/2/4/8 字节)。6.3 查看寄存器命令说明info registers查看所有通用寄存器info all-registers查看所有寄存器含浮点/向量p $rax打印单个寄存器值set $rax value修改寄存器值6.4 查看源码命令说明list / l显示当前行附近的源码l 20显示第 20 行附近l main.c:30显示指定文件的第 30 行附近l func显示函数源码l 10,30显示 10~30 行set listsize 50设置 list 每次显示行数6.5 查看调用栈命令简写说明backtracebt显示完整调用栈bt full—显示调用栈 每层局部变量bt 5—只显示最内层 5 帧frame nf n切换到第 n 帧up—切换到上一层调用者down—切换到下一层被调用者info frame—当前栈帧详细信息含局部变量、参数、寄存器6.6 查看线程命令说明info threads查看所有线程含编号、运行状态、所在函数thread n切换到 n 号线程thread apply all bt打印所有线程的调用栈thread apply n bt打印 n 号线程的调用栈thread apply all bt full打印所有线程的完整调用栈7. 多线程调试命令说明set scheduler-locking off所有线程同时运行默认set scheduler-locking on只运行当前线程其他线程暂停set scheduler-locking stepstep/next 时只运行当前线程continue 时全部运行show scheduler-locking查看当前锁定模式b func thread 3只在 3 号线程命中此断点set follow-fork-mode parentfork 后调试父进程set follow-fork-mode childfork 后调试子进程8. 信号处理命令说明info signals查看所有信号的 gdb 处理方式handle SIGSEGV stop收到 SIGSEGV 时暂停程序handle SIGSEGV noprint收到 SIGSEGV 时不打印信息handle SIGSEGV nostop收到 SIGSEGV 时不暂停跳过handle SIGINT pass将 SIGINT 传递给程序CtrlC 中断signal SIGUSR1向被调试程序发送信号9. Core Dump 调试# 启用 core dumpulimit-cunlimitedechocore.%p/proc/sys/kernel/core_pattern# 分析 core 文件gdb program core.12345bt # 查看崩溃时的调用栈 bt full # 查看调用栈 局部变量 f 3 # 切换到第 3 帧查看该层变量 p var # 在指定栈帧查看变量值 info registers # 查看崩溃时寄存器状态10. 常用命令速查# 启动gdb program# 调试可执行文件gdb--argsprogram arg1 arg2# 带参数启动gdb-pPID# 附加运行中进程gdb program core.12345# 分析 core dump# 运行r / run# 从头运行c /continue# 继续执行n / next# 单步不进入函数s / step# 单步进入函数fin / finish# 执行到函数返回u /until行号# 运行到指定行# 断点b 行号/函数名# 设断点b 位置if条件# 条件断点tb 位置# 临时断点watchvar# 监视变量写入info b# 查看所有断点enable/disable/delete 编号# 管理断点# 查看p var# 打印变量p /x var# 十六进制p *ptr10# 打印数组display var# 自动显示bt# 调用栈bt full# 调用栈局部变量info locals# 局部变量info threads# 所有线程info registers# 寄存器l# 查看源码x /10xw addr# 查看内存# 修改setvarvalue# 修改变量值setargs arg1 arg2# 设置程序参数# 退出q / quit# 退出 gdb