目录调试代码调试注意事项gdb和Cgdb调试命令汇总行号显示断点设置查看断点信息删除断点开启 / 禁用断点运行 / 调试逐过程和逐语句打印 / 追踪变量指定行号跳转强制执行函数补充命令watchset var 替换变量值条件断点end调试代码这是本次调试要用的代码1#includestdio.h23intAddToTop(inttop)4{5printf(Enter AddToTop\n);67intcount0;8for(inti1;itop;i)9{10counti;11}1213printf(Quit AddToTop\n);14returncount;15}1617intmain(void)18{19inttop100;20intretAddToTop(top);2122printf(ret %d\n,ret);23return0;24}下面是Makefile中的内容用于自动化编译1mytest:test.c2gcc test.c-omytest-stdc99-g3.PHONY:clean4clean:5rm-rfmytest注-stdc99表示以c99的标准来编译代码调试注意事项其实对于我们刚才直接make自动化生成的可执行程序是通过gcc直接编译产生得到的它是一个【Release】版本的可执行程序因此无法进行调试但若是我们想要去生成一个【DeBug】版本的可执行程序也是可以的只需要修改一下我们的Makefile即可gcc后面带上一个-g的命令选项此时再去make一下的话生成的就是【DeBug】版本的了 我们才能进行调试给gdb和Cgdb这篇文章我们以Cgdb的形式演示命令我也更推荐大家去用cgdb他和gdb的功能是一样的而且cgdb是可以在上面直接看到代码的比gdb要方便很多。指令:cgdb 可执行程序名 (一定要注意是可执行程序文件)调试命令汇总因为这个调试器是在Linux环境下的是纯命令行模式所以会有很多的指令做好心里准备注括号里面是该指令的全称l(list) 行号/函数名 —— 显示对应的code每次10行r(run) —— F5【无断点直接运行、有断点从第一个断点处开始运行】b(breakpoint) 行号 —— 在那一行打断点b 源文件函数名 —— 在该函数的第一行打上断点b 源文件行号 —— 在该源文件中的这行加上一个断点吧info b —— 查看断点的信息breakpoint already hit 1 time【此断点被命中一次】d(delete) 当前要删除断点的编号 —— 删除一个断点【不可以d 行号】若当前没有跳出过gdb则断点的编号会持续累加 d breakpoints —— 删除所有的断点disable b(breakpoints) —— 使所有断点无效【默认缺省】enable b(breakpoints) —— 使所有断点有效【默认缺省】disable b(breakpoint) 编号 —— 使一个断点无效【禁用断点】enable b(breakpoint) 编号 —— 使一个断点有效【开启断点】相当于VS中的空断点 enable breakpount —— 使一个断点有效【开启断电】n(next) —— 逐过程【相当于F10为了查找是哪个函数出错了】s(step) —— 逐语句【相当于F11】bt —— 看到底层函数调用的过程【函数压栈】set var —— 修改变量的值p(print) 变量名 —— 打印变量值display —— 跟踪查看一个变量每次停下来都显示它的值【变量/结构体…】undisplay 变量名编号 —— 取消对先前设置的那些变量的跟踪排查问题三剑客until 行号 —— 进行指定位置跳转执行完区间代码 finish —— 在一个函数内部执行到当前函数返回然后停下来等待命令c(continue) —— 从一个断点处直接运行至下一个断点处【VS下不断按F5】行号显示l(list) 行号/函数名 —— 显示对应的code每次10行首先若是直接【L】的话便会随机显示出该源文件中的随机10行内容这不是我们想要的若是【L 0】或者是【L 1】的话那就是从第一行开始往下列10行的内容断点设置b 行号 —— 在那一行打断点b 源文件函数名 —— 在该函数的第一行打上断点b 源文件行号 —— 在该源文件中的这行加上一个断点查看断点信息info b —— 查看断点的信息若是我们查看一下所打的断点的信息那就在后面加个b/breakpoint删除断点d 当前要删除断点的编号 —— 删除一个断点【不可以d 行号】d breakpoints —— 删除所有的断点开启 / 禁用断点disable b(breakpoints) —— 使所有断点无效【默认缺省】enable b(breakpoints) —— 使所有断点有效【默认缺省】disable b(breakpoint) 编号 —— 使一个断点无效【禁用断点】enable b(breakpoint) 编号 —— 使一个断点有效【开启断点】运行 / 调试r(run) —— F5【无断点直接运行、有断点从第一个断点处开始运行】再加上断点去运行的话就会在打的断点处停下来逐过程和逐语句n(next) —— 逐过程【相当于F10为了查找是哪个函数出错了】s(step) —— 逐语句【相当于F11一次走一条代码可进入函数同样的库函数也会进入】打印 / 追踪变量p(print) 变量名 —— 打印变量值都执行了那么多次了不知道【i】和【count】发生了怎样的变化将它们打印出来看看吧通过继续执行【n】然后再去打印就可以发现i的值和count的值发生了变化但是你不觉得这样每次去打印会显得很繁琐吗那一定会的所以我们有更好的办法display —— 跟踪查看一个变量每次停下来都显示它的值【变量/结构体…】undisplay 变量名编号 —— 取消对先前设置的那些变量的跟踪指定行号跳转until 行号 —— 进行指定位置跳转执行完区间代码可以看到当前在for循环内容执行累加的逻辑但若是我们一直这么执行下去就没有时间排错了除了上面的哪一种【set var】之外还有一种方法其实起到直接结束当前循环的作用那就是进行指定行号跳转通过观察下图可以看到当我们运行了until 13之后程序直接就给出了我们最终的结果count而且即将要执行最后的打印语句说明我们跳转成功了但是注意的是until并不能跳过断点如果我们跳过的语句中有断点until是会听在断点哪里的强制执行函数finish —— 在一个函数内部执行到当前函数返回然后停下来等待命令有时候我们会有这样的需求在初步排查的时候推断可能是某个函数内部的逻辑出了问题但是呢又不想一步步地进到函数内部进行调试在VS中其实很简单只需要在函数下方设个断点然后F5直接运行到断点处即可补充命令watch执⾏时监视⼀个表达式如变量的值。如果监视的表达式在程序运⾏期间的值发⽣变化GDB 会暂停程序的执⾏并通知使⽤者如果你有⼀些变量不应该修改但是你怀疑它修改导致了问题你可以watch它如果变化了就会通知你.set var 替换变量值对于这个修改变量的值很像是在VS里调试之前设置的那种条件断点可以使调试开始后直接运行到此断点处。不过对于【set var】而言是在调试过程中进行设置条件断点end感谢大家的阅读希望对你有帮助谢谢