学 Linux_day3 GDB 常用命令速查卡学习资料

发布时间:2026/7/26 8:56:15

学 Linux_day3 GDB 常用命令速查卡学习资料 GDB 常用命令速查卡学习资料调试器入门 六大核心命令一、GDB 是什么为什么要学GDB是GNU Debugger的缩写它是一个让你可以逐行运行程序、随时停下来检查变量值、查看函数调用栈的工具。如果不使用调试器程序出错时你只能看着代码干瞪眼或者在代码里插入无数printf。有了 GDB你就可以让程序在指定的地方暂停设置断点一条一条语句地执行观察变量的变化在程序崩溃时查看崩溃时的现场调用栈、变量值GDB 是命令行工具功能极其强大我们今天先掌握最常用的六个命令。二、调试前的准备用-g编译要让 GDB 能读懂你的程序编译时必须加上-g选项它会把调试信息比如源代码行号、变量名等嵌入到可执行文件中。编译命令gcc-ghello.c-ohello如果不加-gGDB 里看不到源代码只能看到汇编指令调试起来很痛苦。启动 GDBgdb ./hello之后就会进入 GDB 的交互界面提示符是(gdb)你在这里输入命令。三、六大核心命令逐一精讲1.break简写b—— 设下断点让程序停住作用在程序执行到某一行代码或某个函数时暂停方便我们检查当时的程序状态。常用形式写法含义break 行号在当前文件的指定行暂停break 函数名在进入指定函数时暂停break 文件名:行号在某个文件的指定行暂停用于多文件项目break 行号 if 条件条件断点只有条件满足时才暂停例子(gdb) break main # 在 main 函数入口暂停 (gdb) break 12 # 在第12行暂停 (gdb) break calc.c:5 # 在 calc.c 的第5行暂停 (gdb) break 20 if x 5 # 第20行只有当 x5 时才停查看已有断点(gdb) info breakpoints删除断点(gdb) delete 断点编号 # 例如 delete 12.run简写r—— 启动程序开始调试作用让程序在 GDB 里开始运行。一旦遇到设置的断点程序会立即暂停交还控制权给 GDB。基本用法(gdb) run如果程序需要命令行参数可以跟在run后面(gdb) run arg1 arg2相当于在终端里执行./hello arg1 arg2。程序一旦暂停你就可以用其他命令查看当前状态了。3.next简写n—— 逐行执行不进入函数内部作用执行当前代码的下一行如果这一行里有函数调用next会直接执行完整个函数不会进入函数体内。可以理解为“单步越过”。什么时候用当你确定某函数没问题不想进去细看它的内部执行时就用next。例子(gdb) break main (gdb) run Breakpoint 1, main () at hello.c:5 5 int x 10; (gdb) next 6 int y add(x, 5); # 假设 add 是一个函数 (gdb) next # 直接执行完 add不会进入 add 内部 7 printf(%d\n, y);如果当前行是add(x,5)按next后程序直接执行完add然后停在下一行。4.step简写s—— 逐行执行会进入函数内部作用和next类似也是执行下一行但如果当前行有函数调用step会“钻”进那个函数里停在函数的第一条语句上。可以理解为“单步进入”。什么时候用当你怀疑某个函数内部有问题需要进去逐行查看时就用step。例子(gdb) break main (gdb) run Breakpoint 1, main () at hello.c:5 5 int x 10; (gdb) step 6 int y add(x, 5); (gdb) step # 此时会进入 add 函数内部 add (a10, b5) at hello.c:12 12 return a b;注意如果当前行没有函数调用step和next的效果是一样的。5.print简写p—— 查看变量或表达式的值作用在程序暂停时查看某个变量当前的值或者计算一个表达式的值。基本用法(gdb) print 变量名 (gdb) print 表达式示例(gdb) break main (gdb) run Breakpoint 1, main () at hello.c:7 7 int sum x y; (gdb) print x $1 10 (gdb) print y $2 20 (gdb) print x y $3 30 (gdb) print sum $4 0 # 因为 sum 这行还没执行所以还是初始值 0$1、$2等是 GDB 给每次打印结果分配的编号后面可以用$1直接引用之前的值。6.backtrace简写bt—— 查看函数调用栈作用显示当前程序执行到了哪里以及它是经过哪些函数调用到达当前位置的。在程序崩溃Segmentation fault时极其有用。基本用法(gdb) backtrace输出是一个栈帧列表最上面是当前正在执行的函数往下面是调用它的上层函数再下层是更早的调用者。示例假设func_c()崩了我们用bt查看(gdb) backtrace #0 0x00005555555551a5 in func_c () at prog.c:15 #1 0x0000555555555185 in func_b () at prog.c:10 #2 0x0000555555555165 in func_a () at prog.c:5 #3 0x0000555555555145 in main () at prog.c:20这告诉我们main调用了func_afunc_a调用了func_bfunc_b调用了func_c问题就出在func_c里的第15行。四、GDB 调试实战演示我们以一个简单的有 bug 的程序为例完整走一遍调试流程。源代码buggy.c#includestdio.hintdivide(inta,intb){returna/b;// 如果 b 是 0 就会崩溃}intmain(){intx10;inty0;intzdivide(x,y);printf(Result: %d\n,z);return0;}1. 带调试信息编译gcc-gbuggy.c-obuggy2. 启动 GDBgdb ./buggy3. 设置断点在 main 函数(gdb) break main Breakpoint 1 at 0x1145: file buggy.c, line 7.4. 运行程序(gdb) run Starting program: /tmp/buggy Breakpoint 1, main () at buggy.c:7 7 int x 10;5. 用next逐行执行观察变量(gdb) next 8 int y 0; (gdb) next 9 int z divide(x, y); (gdb) print x $1 10 (gdb) print y $2 0发现y是 0这会导致除法错误。6. 用step进入divide函数(gdb) step divide (a10, b0) at buggy.c:4 4 return a / b;现在我们可以确认b是 0。7. 查看调用栈如果此时崩溃就可以用bt我们可以先next让它崩溃(gdb) next Program received signal SIGFPE, Arithmetic exception.现在用backtrace看看(gdb) backtrace #0 divide (a10, b0) at buggy.c:4 #1 0x... in main () at buggy.c:9立刻知道崩溃在divide函数的第4行由main第9行调用且参数b0。这就是 GDB 的价值。五、✅ GDB 常用命令速查卡命令简写作用示例breakb设置断点b main,b 12,b file.c:5runr启动程序可带参数r,r arg1nextn执行下一行不进入函数内部nsteps执行下一行会进入函数内部sprintp打印变量或表达式的值p x,p abbacktracebt显示函数调用栈bt其他常用小命令了解即可continuec继续运行到下一个断点quitq退出 GDBlistl显示当前行附近的源代码info locals显示当前函数的所有局部变量六、巩固练习请创建一个新的 C 程序debug_practice.c内容如下#includestdio.hintsquare(intn){intresultn*n;returnresult;}intmain(){inta5;intbsquare(a);intcsquare(b);printf(a%d, b%d, c%d\n,a,b,c);return0;}练习步骤要求用 GDB 完成并观察每一步用-g编译程序。启动 GDB设置断点在square函数。运行程序在square第一次被调用时暂停。用print n查看参数n的值。用next执行int result n * n;然后用print result查看结果。用backtrace查看是从哪里调用的square。用continue让程序继续运行直到第二次调用square暂停再次用print n和bt观察不同之处。最后用continue让程序运行结束退出 GDB。参考答案关键观察点第一次到square时n5bt会显示#0 square, #1 main。执行完result赋值后result25。第二次到square时n25因为 b25bt仍类似。全程没有崩溃但你能体会到断点和打印的配合。七、学习检查清单在结束之前问自己这几个问题能答出来就说明你真正掌握了设置断点有哪几种写法如何删除一个断点next和step的区别是什么什么时候必须用step程序崩溃后哪个命令能最快定位崩溃的函数和行号如何查看当前函数里某个局部变量的值启动 GDB 时要求可执行文件必须有什么特殊信息编译时加什么选项如果都可以流畅答出恭喜你GDB 的入门调试你已经拿下。之后遇到任何 C 程序问题都可以拿出这六张速查卡来逐步排查就像用ls、cd一样自然。

相关新闻