做微商网站发帖免费教程,南宁企业免费建站,托管服务器是什么意思,电影网绪论 “不用滞留采花保存#xff0c;只管往前走去#xff0c;一路上百花自会盛开。 ——泰戈尔”。本章是Linux工具篇的最后一章。gdb调试工具是我们日常工作中需要掌握的一项重要技能我们需要基本的掌握release和debug的区别以及gdb的调试方法的指令。下一章我们将进入真正… 绪论 “不用滞留采花保存只管往前走去一路上百花自会盛开。 ——泰戈尔”。本章是Linux工具篇的最后一章。gdb调试工具是我们日常工作中需要掌握的一项重要技能我们需要基本的掌握release和debug的区别以及gdb的调试方法的指令。下一章我们将进入真正的进入到Linux操作系统敬请期待早关注不迷路。话不多说安全带系好发车啦建议电脑观看。 思维导图 1.debug模式和release模式
在了解debug和release之前先对公司在要开发某个项目时所要经历的过程有个大概的了解 确立项目搭配资源开发人员、测试人员、项目经理负责项目进程、产品经理该产品的主要负责人…开始开发进行测试上线灰度上线内测阶段- 正式上线) 运营人员项目的推广运维人员解决出现的bug 在上面阶段中我们作为开发人员我们在开发编程过程中最终编写好的程序就是以debug模式而注意的是最终交给测试人员时是以release模式的。 原因在于也就是debug、release模式是什么 debug模式下才能进行代码的调试因其中包含许多调试信息导致多占用一些空间。所以反之release模式下就没有了调试信息这样就能节约一定的空间也就不能调试。release模式下还对代码会有许多的优化让其大小和运行速度上都到最优的状态如删除未使用的代码、内联函数等所以我们普通用户用的就是release版本所以测试人员也应该测试该版本。 所以当测试人员测试处出现bug后就会再次交还给开发人员来修复3 4阶段不断重复最终测试完成才上线。 注意我们在使用gcc/g进行编译时默认生成的是以release模式的、vim使用时默认是命令模式 2. gdb gdb也就是Linux下的一个用来调试的工具其就是通过指令的方式来进行一系列调试工作打断点、查看变量信息、… 其中注意的是因为gcc默认生成的是release的所以我们需要在常规用gcc生成可执行程序gcc -o $ $^时多加个附加指令 -g 2.1为什么debug模式的文件大小 release模式的文件大小 debug模式下会生成的可执行程序会添加调试信息反之release模式下没有 证明下面我们生成两个模式的可执行程序进行观察 注意生成debug模式的需要对gcc添加附加指令 -g 我们用Makefile生成了两种模式的可执行程序可以发现debug模式下的文件的大小要大于release模式下的下图第五列表示文件大小其中就是因为有调试信息导致的。 可能上面的不够有说服力那么我们用更加显著的证据来证明 因为我们在Linux下形成的可执行程序格式转换成二进制的方法就是通过ELF格式来完成的它包含许多可执行程序的信息代码的开始、结束、代码和数据的区分、入口地址、程序的加载… 下面一个新指令readelf -S 可执行程序就能查看一个可执行程序的二进制构成 那么我们要查看这个程序中是否含有调试信息我们就能通过grep过滤器去找readelf -S 可执行程序 | grep -i debug-i 忽略大小写 debug调试信息名 从上图中就能发现release模式下就没有debug信息而debug模式下则过滤出来了。
2.2gdb的使用指令
运行gdbgdb 可执行程序退出gdbquit查看代码llist 默认情况下他会自动显示重要的部分指定开始的位置用l 开始的行号但只会显示部分查看某个函数l 函数名再按回车就会继续往下显示当显示完成后就无法再按因为gdb会记录历史命令按回车就是再次执行上面的命令 执行代码相当于直接VS下的F5进行调试rrun 若有断点就命中反之则直接执行完了 在某行打断点b 行号break point 若存在可执行程序中有多个源文件可以用 b 源文件名 : 行号还可以直接对函数进行打断点b 函数名 打到函数入口处第一条指令 查看打过的断点info b 每个断点都有自己的编号NUM显示当前局部域的全部变量info local 删除断点d 断点编号 注意在gdb运行期间删除后的断点编号不会被后面新增的断点覆盖也就是后面的断点的编号是不断增加的不会覆盖之前的 关闭断点、启用断点disable 断点编码、enable 断点编码 在info信息中的Enb信息代表着断点是否启用其中y表示启用yes、n表示关闭no 逐语句相当于VS中的F11单步往后走碰到函数会进入s逐过程相当于VS中的F10若有函数并不会进入内部 n查看变量监视器p变量名常显示某个变量用p只能查看当前display可以一直关注其变化display 变量名 若要删除某个常显示的变量用 undisplay 编号display时前面会给变量添加编号 直接跳到某行until 行号运行到指定行直接运行完当前所在函数finish跑到当前函数的结尾直接运行到下一个断点c查看调用的堆栈bt直接在gdb中改变变量的值set var 变量名 改后的值当退出gdb后打过的断点信息就会被移除。 本章完。预知后事如何暂听下回分解。
如果有任何问题欢迎讨论哈
如果觉得这篇文章对你有所帮助的话点点赞吧
持续更新大量Linux细致内容早关注不迷路。