尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
gdb与cgdb
1.gdb与cgdb介绍与安装我们在使用vim编写完代码之后想要和VS那样调试代码看看有没有什么问题这个时候就需要gdb与cgdb来协助了。gdbGNU Debugger是 GNU 项目提供的一种调试工具用于调试 C、C 和其他编程语言编写的程序。它允许程序员查看和控制程序的执行从而帮助找到和修复程序中的错误。cgdb 是 gdb 的一个前端它提供了一个更为用户友好的命令行界面结合了文本用户界面TUI和普通的命令行。CGDB 提供了更加直观的视图和界面使得调试过程更为高效。要安装就可以使用以下代码-- 安装gdb/cgdb sudo yum/apt install -y gdb sudo yum/apt install -y cgdb -- 检查是否安装成功 gdb --version cgdb --version具体在安装过程中是使用yum还是apt看具体各位读者安装的系统是什么样的CentOS 用 yumUbuntu 用 apt。2.两者的区别我们在使用gdb时是比较麻烦的因为gdb是不会显式文件源代码的这样我们就比较抓瞎调试起来比较困难因此有了cgdbcgdb在使用过程中会单独分出一块区域来显式源代码这样对于我们调试代码而言是比较善良的。因此我们一般使用cgdb来调试代码。同时两者的功能上的共同点底层都是 gdbcgdb 只是 gdb 的一个 外壳真正调试的时候还是调用 gdb 来下断点、单步、查看变量。功能完全一致gdb 能做的下断点、单步、查看栈、看内存、修改变量值cgdb 都能做命令也一模一样break、next、step、print、run、continue等。都需要-g编译调试前都要求编译时加-g。区别gdbcgdb界面纯文本命令行只有一个窗口分屏界面上面显示源码下面是 gdb 命令窗口源码可见性要看代码得自己另开一个窗口自动高亮当前执行到哪一行断点可视化打了断点也不直观源码窗口直接显示断点标记b学习成本纯命令行要背命令多了分屏交互但 gdb 命令还是要会依赖独立程序必须装了 gdb 才能跑快捷键无全靠命令有快捷键如方向键翻源码、空格设断点3.两者的使用我们在前面写C语言C代码用VS时可以发现有Debug和Release版本前者是对于我们程序员的版本可以调试在编译时效率相对而言更低。而后者Release版本则是面向用户的一个版本这个版本在运行时速度更快产生的可执行文件大小更小便于下载效率更高编译器优化更加显著但是无法调试。我们正常在Linux里面gcc和g生成的可执行程序都是这个版本无法调试因此我们在使用gcc和g时就需要加上-g这样生成的可执行程序就是Debug版本。可以用来调试。1.命令表格前面也提到cgdb在使用时会有源代码窗口比较方便所以作者这里之大概介绍cgdb的使用开始 cgdb binFile退出 ctrl d 或quit 调试命令命令作用样例list/l显示源代码从上次位置开始每次列出 10 行list/l 10list/l 函数名列出指定函数的源代码list/l mainlist/l 文件名:行号列出指定文件的源代码list/l mycmd.c:1r/run从程序开始连续执行runn/next单步执行不进入函数内部类比VS逐过程 F10nexts/step单步执行进入函数内部类比VS逐语句 F11stepbreak/b [文件名:]行号在指定行号设置断点break 10break test.c:10break/b 函数名在函数开头设置断点break maininfo break/b查看当前所有断点的信息info breakfinish执行到当前函数返回然后停止finishprint/p 表达式打印表达式的值print startendp 变量打印指定变量的值p xset var 变量值修改变量的值set var i10continue/c从当前位置开始连续执行程序continuedelete/d breakpoints删除所有断点delete breakpointsdelete/d breakpoints n删除序号为 n 的断点delete breakpoints 1disable breakpoints禁用所有断点disable breakpointsenable breakpoints启用所有断点enable breakpointsinfo/i breakpoints查看当前设置的断点列表info breakpointsdisplay 变量名跟踪显示指定变量的值每次停止时display xundisplay 编号取消对指定编号的变量的跟踪显示undisplay 1until X行号执行到指定行号until 20backtrace/bt查看当前执行栈的各级函数调用及参数backtraceinfo/i locals查看当前栈帧的局部变量值info localsquit退出 GDB 调试器quit很多的命令都是可以直接用一个字母来代替整个单词的。2.命令案例首先是作者的示例代码1 #include stdio.h 2 int Sum(int s, int e) 3 { 4 int result 0; 5 for(int i s; i e; i) 6 { 7 result i; 8 } 9 return result; 10 } 11 int main() 12 { 13 int start 1; 14 int end 100; 15 printf(I will begin\n); 16 int n Sum(start, end); 17 printf(running done, result is: [%d-%d]%d\n, start, end, n); 18 printf(running done, result is: [%d-%d]%d\n, start, end, n); 19 printf(running done, result is: [%d-%d]%d\n, start, end, n); 20 printf(running done, result is: [%d-%d]%d\n, start, end, n); 21 printf(running done, result is: [%d-%d]%d\n, start, end, n); 22 printf(running done, result is: [%d-%d]%d\n, start, end, n); 23 printf(running done, result is: [%d-%d]%d\n, start, end, n); 24 printf(running done, result is: [%d-%d]%d\n, start, end, n); 25 printf(running done, result is: [%d-%d]%d\n, start, end, n); 26 printf(running done, result is: [%d-%d]%d\n, start, end, n); 27 printf(running done, result is: [%d-%d]%d\n, start, end, n); 28 printf(running done, result is: [%d-%d]%d\n, start, end, n); 29 printf(running done, result is: [%d-%d]%d\n, start, end, n); 30 printf(running done, result is: [%d-%d]%d\n, start, end, n); 31 return 0; 32 } 33l看10行代码r运行代码除非碰到断点否则执行完全部b设置断点info b查看已设置断点已经设置断点的位置行号会标红。我们只在设置断点的时候使用行号其他时候对断点进行操作都是通过断点编号完成。r运行断点s逐语句调试在使用s遇到printf等函数时会有跳转到汇编代码这是因为s是逐语句的执行而printf是库函数就会跳转到对应的位置去执行这个时候如果要退出汇编就要用finish并且在执行printf等函数时要用n而不是s。下面例子作者先用disable 断点编号 来使得断点失能就是不能用了然后再r运行。finish退出汇编语言。display跟踪显式指定变量3.命令补充我们在使用命令时系统会自动记录下最近的命令指令然后我们只需要再按回车就可以再次执行上次的命令操作比如我输了一个n然后回车执行完成之后我只需要再按一次回车他依旧会执行n直到输入了新的指令才会覆盖在输入新指令之前想要一直n就一直回车即可。此外作者还额外补充三种指令可以帮助更好的调试代码首先是watchdisplay和watch都是用来监视变量两者的区别在于前者是一直显示后者是只有监视的变量改变值的时候才会显示出来并且watch会把旧的和新的值一起显式。set var用于临时改变某个变量的值直到这次调试完成运用场景一般是在调试过程中我们已经发现了一个已经存在的问题然后可以用set var来设置变量成为预期内的数值这样就可以继续后面的调试可以先跳过当前问题看看后面有没有其他问题设置条件断点我们如果设置了循环里面一条语句的断点在循环的调试里面经常一直要c来运行这比较麻烦可以通过b 行数 if 条件来设置条件断点同一条语句只有在符合条件时才会停下其他情况下并不会停止要注意条件判断等于是是赋值会直接执行我们也可以通过condition 断点编号 条件来对已经存在的断点设置条件作者仅仅是对gdb的用法做简单说明还有很多其他用法可以读者自行拓展。
RELATED

相关推荐

香味油墨与普通油墨有什么区别?一文讲清

香味油墨与普通油墨有什么区别?一文讲清

摘要:香味油墨作为功能性特种油墨,与普通油墨在配方组成、印刷工艺、成品性能和应用场景上存在明显差异。本文从多个维度系统对比两者的区别,帮助印刷厂和品牌方在选型时做出合理判断。一、引言:为什么要区分香味油墨与普通油墨 在…

📅 2026/10/15 4:02:51
JavaScript 的错误处理——程序出错时该怎么办

JavaScript 的错误处理——程序出错时该怎么办

引言没有人能写出永远不出错的代码。真正区分水平的,不是谁不出错,而是出错之后怎么办。错误处理做得好,程序能优雅降级、给出有用提示、快速定位问题;做得差,用户看到白屏,开发者对着日志发呆。这篇文章不…

📅 2026/10/15 4:02:51
Day3:结构化输出

Day3:结构化输出

在LangChain中,聊天模型提供了额外的功能:结构化输出。一种使聊天模型以结构化格式(例如JSON)进行响应的技术。例如,可能希望将模型输出存储在数据库中,并确保输出符合数据库模式。这种需求激发了结构化输出的概念,其中可以指示模…

📅 2026/10/15 4:02:51
MORE NEWS

更多资讯

📰

PyTorch核心设计原理与工业级训练实践

1. 这不是“学个框架”那么简单:PyTorch到底在解决什么真实问题?很多人第一次听说PyTorch,是在某次技术分享会上听到“动态图好调试”“API设计更Pythonic”这类评价;也有人是从Kaggle竞赛排行榜上看到大量Top方案的代码仓库里&am…

📰

从零搭建大学生就业信息管理系统:需求、设计到实现

1. 这个系统解决什么问题:需求拆解与功能边界大学生就业信息管理系统我接触得比较多,每年都会看到不少计算机相关专业的同学拿它当毕设选题。第一反应往往是“这不就是一个信息管理的增删改查吗”,但真正动手做起来才会发现,角色权…

📰

TensorFlow全流程实战:从环境搭建到模型部署的完整链路

这不是一篇入门教程,也不是API文档搬运。从我第一次在项目里跑通TensorFlow,到现在能用它顺畅地完成从数据准备到模型部署的全流程,中间绕了很远的路,也踩了不少坑。这篇文章把你真正会用到的那些东西——环境、数据、模型、训练、…

📰

airllm:低显存机器跑超大语言模型的实践指南

实际测试完成的部署方案:如何在低内存机器上跑超大容量语言模型最近 AI 本地部署群里讨论最多的一个话题,不是新模型的评测,而是“我到底要多少显存才能跑得动这些模型”。动不动几十GB的权重,让很多人的消费级电脑直接劝退。如果…

📰

RAR归档文件解压全指南:从格式识别到批量处理与避坑

简介:GC-PowerStation 2019中文版是面向表面贴装工艺工程师的坐标导出与光绘文件处理工具,支持导入电子表格、文本等多种坐标文件格式,并完成多层光绘文件的预览、合并与校验,帮助电子制造从业者在生产前检查设计准确性&#xff0…

📰

易语言乐玩插件窗口句柄获取与后台绑定模式实战指南

1. 窗口句柄获取与后台绑定模式的核心逻辑拆解1.1 为什么窗口句柄是一切自动化操作的起点做桌面自动化或者辅助工具开发,绕不开的第一个坎就是拿到目标窗口的句柄。你可以把窗口句柄理解成操作系统给每个窗口发的一张身份证号,它是一个长整型数值&#x…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬