2026/1/7 17:51:40
网站建设
项目流程
重庆网站建设沛宣网络,网站建设与推广的销售,网站建设推广seo,门户网站用虚拟主机故事背景事实上#xff0c;gdb调试器#xff0c;是一个用于我们linux命令行式的调试工具#xff0c;但是但凡接触过一些vscode或者studio这些图形化的自带图形可视化的调试工具#xff0c;gdb是确实不好用我还不如自己连一些服务器到vscode呢。 但是gdb依然是功能强大…故事背景事实上gdb调试器是一个用于我们linux命令行式的调试工具但是但凡接触过一些vscode或者studio这些图形化的自带图形可视化的调试工具gdb是确实不好用我还不如自己连一些服务器到vscode呢。 但是gdb依然是功能强大纯命令行环境下不可或缺的工具哈所以接下来俺带你看看它咋用core 程序核心转储文件 通常用于gdb调试那着core文件可以迅速判断代码的错误信息进程终止如果你对进程的终止是over 不是停止 区别于情况有足够的了解你可以可以参考上图理解当进程退出的时候如果生成了核心转储文件即在状态码的第8位 core 变位1 表示生产力状态码core信息调试就一句话当系统生成了core文件指令gdb 程序名 core文件名 如 gdb test core.file然后gdb会帮你直接找到程序崩溃的行并打印所在代码上下文但是要注意一件事 就是linux系统默认不生成core文件所以你得打开一般不打开笔记调试方式千千万抓到鱼的才是好猫咪临时开启ulimit -c unlimited永久生效修改/etc/security/limits.conf加* soft core unlimited~也可以这样永久生效 就是在~/.bash_profile 启动时候执行的指令本文就不带你用core去调试了能用就行跟上小哥的节奏咱直接调试一个实例试试有问题的demo代码void func(){ std::couthello wold; int b 2; b; for(int i0;i10;i){ int c 2; 3/b; b--; } } int main(){ int c 3; int b 2; c; b--; func(); return 0; }提前看出这里代码func函数中当b为0的时候/0问题进程会收到 SIGFPESIGFPE 是浮点异常信号FPEFloating Point Exception 信号 我们可以用调试器来找到这个错误的位置 开始吧和我一起用gbd调试器1.1 基本的命令 /操作listl 行号显示binFile源代码接着上次的位置往下列每次列10行。 listl 函数名列出某个函数的源代码。 r或run运行程序。 n 或 next单条执行。 s或step进入函数调用 break(b) 行号在某一行设置断点 break 函数名在某个函数开头设置断点 info break 查看断点信息。 finish执行到当前函数返回然后挺下来等待命令 print(p)打印表达式的值通过表达式可以修改变量的值或者调用函数 p 变量打印变量值。 set var修改变量的值 continue(或c)从当前位置开始连续而非单步执行程序 run(或r)从开始连续而非单步执行程序 delete breakpoints删除所有断点 delete breakpoints n删除序号为n的断点 disable breakpoints禁用断点 enable breakpoints启用断点 info(或i) breakpoints参看当前设置了哪些断点 display 变量名跟踪查看一个变量每次停下来都显示它的值 undisplay取消对先前设置的那些变量的跟踪 until X行号跳至X行 breaktrace(或bt)查看各级函数调用及参数 infoi) locals查看当前栈帧局部变量的值 quit退出gdb1.2 调试基本操作理念首先你要知道gdb的调试真的就是基于命令 与断点来的否则会很不舒服基本页面如下tip 你编译成员的时候必须加上 -g选项 才能调试哦提前设置main为断点其次就是 r运行起来然后s/n 逐语句或者逐过程 直到报错的位置。如果是逻辑错误你可以用watch查看变量1.3 具体调试例子1. 输入gdb 可执行程序名进入到该执行页面 值得注意的是gdb就是长这样(gdb) 待输入命令回显gdb待输入命令gdb q -----------q就退出啦你会觉得很不习惯可以先看看代码 如果你不知道代码多少行你可以 尽量大些2. 显示代码3. 设置断点breakpoint)断点操作合集哈1. 设置断点 b 行号b 函数名2. 查看所有断点 info b3. 删除断点 delete 序号我这里先设置main函数为断点 如图值得注意的是 调试的时候第一件事是进入程序你要执行run命令但是run命令会优先跳到第一个断点所以你的断点要是不设置就直接运行完了你还调试啥所以我这里先把断点设置在main函数4. run起来你也可以用r表示run哈 进入以后还会贴心的回显一下你所在的位置上下文也就是执行流到了main已经回显它的上下文5. 逐过程和逐语句为了便于调试你可以用list 默认输出当前执行流上下文默认5行代码这样便于你调试逐行调试/逐语句命令作用场景nnext逐行执行跳过函数调用不想进入 func 函数只看主流程sstep逐行执行进入函数内部想调试 func 函数里的代码比如执行到func()时输s就会进入第 22 行ccontinue从当前位置运行到下一个断点跳过中间代码直接到下一个断点finish执行完当前函数回到调用处在 func 内部时输finish回到主函数调用 func 的位置注意有时候我们的执行流可能跳转到我们的头文件包含的一些库函数我们直接输入finish即可继续显示上下文 然后逐语句执行 s命令 注意它不会跳过函数逐过程n 会跳过函数非常贴心的为你回显每次执行了啥6. 查看变量值监视)用where查看执行流正在执行哪一行监视打印变量值p 变量名比如p c查看主函数里的 c 值支持p cb计算实时监视变量watch 变量名比如watch c变量值变化时 GDB 会暂停并提示查看当前所有局部变量info locals直接输出当前函数内的所有变量值执行到这发现一个简单的问题就是这是这就是执行流进入库函数了你直接finish即可继续逐过程直到出错出错了6. bt可以查看调用栈查看是谁调用的以及被调用也就是查看当前函数是谁以及谁调用了它