专栏首页高性能服务器开发如何成为一名合格的 Linux C/C++ 后台开发者?

如何成为一名合格的 Linux C/C++ 后台开发者?

我从学生时代到进入软件开发这个行业,不知不觉已经十余年了。这些年,先后在网游公司做过游戏服务器,为上海某交易所做过金融交易系统、在金融证券公司做过股票证券交易系统和即时通讯软件、在音视频直播公司做过直播服务器,各种项目使用的服务器操作系统都是 Linux,开发语言是 C/C++。

正如从事 Windows C/C++ 开发的一定要熟悉 Visual Studio、从事 Java 开发的要熟悉 Eclipse 或 IntelliJ IDEA、从事 Android 开发的要熟悉 Android Studio、从事 iOS 开发的要熟悉 XCode 一样,从事 Linux 开发的要熟悉 GDB。

GDB 有多重要?分享我的经历侧面回答一下这个问题。

01

熟练使用 GDB 是 Linux C/C++ 开发人员的基本素养

我之前有份后台开发的工作,部门有个不成文的规定:即使很明确的程序,每个分支必须使用 GDB 调试器去追踪一下程序,看看执行过程中的各种中间状态是否符合预期。

很多人想当然地觉得代码就会按预期的流程去执行,但是实际上一到生产环境总会出现这样那样的问题,这是很多 Bug 产生的原因。在调试的过程中,能够学到很多可能想不到的知识。

我开始是做 Windows C/C++ 开发的,后来转做 Linux C/C++ 开发,刚开始对 Linux 环境下没有图形化的可视化界面很不习惯,因此很多简单的代码段也就不愿意去调试,后来系统事故频发,造成了一些不好的影响,慢慢地意识到调试的重要性。

后来,我做了技术管理者,每次面试技术候选人,我会问他熟悉哪些开发工具。有些面试者对各种开发工具都不熟悉,我猜想这类应聘者应该是基本“不写代码”或者“不会写代码”的,面试结果可想而知。

“工欲善其事、必先利其器”,作为一名合格的软件开发者,至少得熟悉一种软件开发工具和调试器,而对于 Linux C/C++ 后台开发,舍 GDB 其谁?

虽然 Linux 系统下大家编写 C/C++ 代码的 IDE 可以自由选择,但是调试生成的 C/C++ 程序一定是直接或者间接使用 GDB。

可以毫不夸张地说,我做的所有项目的开发和调试包括故障排查都是利用 GDB 完成的。调试是开发流程中一个非常重要的环节,对于从事 Linux C/C++ 的开发人员,熟练使用 GDB 调试是一项基本要求。

02

熟练使用 GDB 是学习优秀开源项目的一把钥匙

一些初中级开发者可能想通过阅读一些优秀的开源项目来提高自己的编码水平,但是只阅读代码,不容易找到要点,或者会误解程序的执行逻辑,最终迷失方向。

如果能实际利用调试器去把某个开源项目调试一遍,学习效果才能更好。站在 Linux C/C++ 后台开发的角度来说,学会了 GDB 调试,就可以对各种 C/C++ 开源项目(如 Redis、Apache、Nginx 等)游刃有余

简而言之,GDB 调试是学习这些优秀开源项目的一把钥匙。

另外,由于 C++ 这门语言多态特性的存在,我们看到的代码执行脉络和实际中的执行流程可能会不一样,特别容易搞错。

我觉得最好的学习方法就是调试这些开源软件,无论多么复杂的程序,只要可以调试,就总可以搞得明明白白的。而一些程序的细节,我们可以通过修改源码调试观察,最终把原理搞得透彻。

03 我的 GDB 学习轨迹

刚开始,我通过网络资料学会了一些简单的 GDB 命令,这时候我在工作中会刻意找一些 demo 程序去调试。

在调试的过程中,遇到了一些需要重复操作才能触发的断点,在厌倦反复手工操作以后,学会了临时断点、条件断点和硬件断点的添加方法。

后来在跟多线程程序斗智斗勇的过程中,学会了如何在各个线程之间切换和查看当前线程调用堆栈。

再后来学习 Apache HTTP Server、Nginx 这样的软件,新的连接会 fork 一个新的进程来处理客户端数据,这又逼着我去研究利用 GDB 调试多进程程序

当在 GDB 中由于字符串太长或者遇到了 \0 的字符内容时,print 命令显示字符串不全,我不得不再次寻找答案。

当遇到 stl 容器中的元素是自定义元素时,GDB 自带的 print 命令显示效果可能不尽如人意,我又寻找按自己的要求显示这些元素的方法。

......

办法总比困难多,在坚持之后,我发现已经找到了能够搞明白任何 Linux C/C++ 程序的钥匙。

而这把钥匙是很多人苦苦寻找的。

我把找到这把钥匙的经验汇集成册,在 GitChat 平台上发布了《Linux GDB 调试指南》,希望能帮助需要的朋友找到自己的钥匙。

这个图文课程共 19 篇,内容由浅至深,详细地讲解了调试的基本原理和实际项目调试中各种 GDB 命令的灵活使用。

与网络中各种 GDB 调试教程不同,它结合我这些年开发与调试各种 C/C++ 项目的经验,除了 GDB 各种基础命令的讲解,还专门介绍了一些高级 GDB 调试技巧。尤其是多线程程序的调试,这是令很多开发者头疼的一个难题。

最后给出了一个完整的使用 GDB 来分析和学习 Redis 网络通信模块的源码案例,希望以此抛砖引玉,帮助大家掌握学习开源软件的方法。

本文分享自微信公众号 - 高性能服务器开发(easyserverdev),作者:范蠡

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++ 如何进阶?如何准备 C++ 面试?

    在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃。

    范蠡
  • 网络编程基础漫谈(三)之 select 函数重难点解析 甲篇

    select 函数是网络通信编程中非常常用的一个函数,因此应该熟练掌握它。虽然它是 BSD 标准之一的 Socket 函数之一,但在 Linux 和 Windo...

    范蠡
  • 600万行代码!计划两年结果做了十二年,直到负责人被丢进监狱

    一个原本复杂性不高、预计只需两年的政府项目,实际上最后却用了十二年,直到项目负责人被逮起来丢进监狱才完事。一位亲身经历这个项目的程序员,在之后十年间断断续续写了...

    范蠡
  • Python 增加博客园阅读量

      一般来说,阅读量是通过 ip 识别的,如果一个 ip 已经请求过了,下一次就不再增加阅读量。因此,想要增加阅读量,就需要不同的 ip 进行请求。大致清楚了之...

    py3study
  • 毕啸南专栏 | 对话百度王海峰:AI时代会产生新巨头

    作者简介:毕啸南,知名青年学者,量子位专栏作家,《中国AI领袖人物访谈》系列制片人、主持人。点击文末阅读原文,关注量子学园的毕啸南专栏,跟随他一起持续深度对话李...

    量子位
  • JGulp: 利用Gulp 配置的前端项目自动化工作流

    商业竞争时代的Web 开发,效率越来越成为其中决胜的关键因素之一。在前几年的时候,前端是一片荒芜的待开垦之地,开发者更多考虑开阔更多技术疆域;而最近几年,在前端...

    Jeff
  • 如何利用IDA Python浏览WINDOWS内核

    当我去参加安全会议时,我总喜欢跟大神们讨论关于逆向工程方面的东西。因为这样我就可以从别人的经验中了解到他们是如何自动化实现那些繁琐操作的了。值得一提的是,很多人...

    FB客服
  • AI又赢了!美国“奇葩说”人类辩手连败两场

    本周一,IBM开发的人工智能Project Debater与人类辩手的两场辩论中,均取得了胜利。研究人员称,开发这款机器视为了帮助人类建立充分知情的论点并做出更...

    IT派
  • IBM人工智能系统赢得人机辩论比赛

    IBM的人工智能系统Project Debater近日分别和以色列国家辩论冠军、以色列国际辩论协会主席分别进行了人机辩论比赛,并全部获胜。

    人工智能快报
  • Android 教程:开启 Chrome 的阅读模式

    ? 如今许多网站版面上都排布着一些大大小小的广告,这些无关内容不仅侵蚀版面,也在一定程度上干扰我们阅读。为了营造一个干净的阅读环境,一些浏览器内置了阅读模式。...

    非著名程序员

扫码关注云+社区

领取腾讯云代金券