当前位置: 首页 >  开发指南 >  Linux后台开发调试经验分享

Linux后台开发调试经验分享

导读:毕业超过十年了,感慨岁月无情。做了若干年后台开发(之前做电信领域),大致说一下常见的开发心得和调试手段。使用互联网这么多年,收获的很多,总结的很少。本着互联网精神,希望可以帮到互联网另一端的你。由于本人是做.C 语言的开发,陈述的经验也是 C 常用的调试手段。.调试很麻烦,困扰着

毕业超过十年了,感慨岁月无情。做了若干年后台开发(之前做电信领域),大致说一下常见的开发心得和调试手段。使用互联网这么多年,收获的很多,总结的很少。本着互联网精神,希望可以帮到互联网另一端的你。由于本人是做 C 语言的开发,陈述的经验也是 C 常用的调试手段。

调试很麻烦,困扰着无数程序员们。很难有人保证自己写的代码一行错误都没有,有问题你就要查。怎么查?高手者,反汇编,看 2 进制;low 一点的就 gdb、看统计;再 low 就加打印。还可以再 low 吗?可以,自己写 bug,别人查。方法林林总总,长期掌握总可以找到适合自己的。

而调试的目的是什么,找到 BUG。想当年一个高手比喻的好:你找 BUG 其实你就是福尔摩斯,为啥是福尔莫斯呢?想想你看到 BUG 案发现场– 合格的程序都有日志、dump 内存、计数等基本案发现场吧。嗯,什么都没有,找写代码的人自己查。找问题就是在众多信息中,抽丝剥茧,找到疑点、反复推演程序运行的代码,最终找到作案的那一行或者几行代码。

这个过程很折磨人,没有任何眉目时,令人茶不思饭不想。找到问题问题后,如打鸡血般兴奋,自己也会陶醉般飘飘然。真正受过折磨的人,才能体会到修改问题的滋味一二。

开发的程序大致要经过一下两个阶段,最终才可以上线发布。

功能开发阶段

本阶段的主要目标是根据业务要求,开发程序。仅仅是 coder,仅仅是写 if else 吗?写程序真的是这样吗?如果是这样,那么 coder 会更加工厂话,枯燥化。

做事都讲究未雨绸缪,做程序更应该这样。大学 C 语言经典教材中定义程序为:程序 = 数据结构 + 算法。而实际生产的过程中,将商业程序做如下的补充定义,我觉得更合适:程序 = 数据结构 + 算法 + 业务逻辑(计算逻辑)+ 框架;

先说说为什么补充业务逻辑,有意义的程序本身就是某种业务逻辑(计算逻辑)的抽象。完成这个业务逻辑才是最终的目的,请不要拿一些算法研究的 code 和我抬杠。

其实作为开发人员,测试驱动开发(TDD)很好思考问题的思路。也许有人听过,也许有同学用过,如果感觉使用不好的兄弟,我可以告诉大家:应该是测试场景 + 场景驱动开发。对,仅仅是里面融入“场景”这个宾语,大家在做开发的时候,就有目的性和针对性。

任何一个业务逻辑,都可以拆分为多个业务场景。场景逐一解决,场景逐一测试,我们开发其实很简单。说的很简单,但是整个过程,需要 50%的时间思考解决问题场景, 20%的编码,30%的测试。其实思考问题的 50%的时间,可以放在任何时间去做(休息时,地铁上,班车上…),只要让自己足够的静,你就会将整个业务逻辑思考的很清楚,分解为多少个业务场景也很明确。对于复杂的业务场景,建议适当的做笔记,多从全局的业务逻辑考虑:自己细化的得到结论是否符合所有的业务场景。反复的修正,直到正确。

具体编码的时候,经过我们前面的深思熟虑,每个细节都已经很清楚了,采用迭代的方式,批量的交付小的功能点就可以了。

开发阶段的总结两个关键字:TDD + 迭代。需要详情的同学自行 baidu,google。

功能调试阶段

调试的手段很多,走读代码,打日志,gdb,统计,coredump 等,如果有精力也可以搞搞的白盒测试什么的。测试的意图也很明显,确认代码是否按照正确的编码意图在运行!其实自己写的代码,自己还是可以轻松驾驭调试的,原因就是自己清楚代码的本意该如何运行,现在出现了什么问题。

程序员的三大悲剧之一,就是不知道什么时候需要定位一个其他人写的 bug。定位前也需要必须要理解另外一位程序员写这段代码的意图是什么,否则没有办法定位。理解其他的人写的代码途径也就是通过阅读代码了解大致思路,通过日志、gdb、或者统计信息补充代码意图的更多细节,或者修正理解不对的思路。

这个过程可能很枯燥,也可能很有挑战,试图通过种种迹象去了解另外一个程序员写代码的初衷和意图,会不会有窥探人家隐私的赶脚!

其实,上面说了这么多只是告诉大家调试好的前提,和调试的初衷。

一个优秀的程序员,你会发现他有很多调试技巧,也就是很多调试手段获取自己想得到信息。信息获取的多,自然就很容易清除程序本身的意图。

调试工具的使用细节和说明,同学们可以自行 baidu,google。

我在这里简单的阐述一下自己是怎么调试程序的,怎么理解各种工具的,欢迎大虾门指点交流?

1) 关于日志

如何打好日志绝对是门学问。日志打印多了,自然会影响后台程序的性能;同样打印的少了,没有办法定位问题;更苦逼的是打印到空指针,更有可能 coredump 掉自己的程序;

所以日志的技巧就是:少,且内容丰富。

如何少,其实就是汇聚。

能不能将表达同一个意思的打印减少?

能不能在关键异常的地方加上统计(输出统计)?

能不能不打?

能不能内存中记录关键信息,在想要的时候,控制其打印时机?

如何丰富,其实就是少打描述性词汇,多打有用的程序运行信息。

方法很多,大家多多思考。并且打印的优化,是反复优化的过程,不是一蹴而就的。曾经遇见一个大牛,测试部提问题了,这哥们从来不去定位。直接告诉测试的兄弟,帮忙执行以下软调,将收集的日志给他分析一下就可以解决问题。

2) 关于 gdb

还有大牛说过:“我就是程序,程序就是我”。我常用 gdb 来检验自己对程序的理解。常用的 gdb 功能就是打印一些程序的运行信息,修改一些内部运行信息,构造复杂场景。

其实很简单,程序在什么场景下应该有什么样的行为,我自己的必须清楚。必须知道关键变量的信息是否正确,周期 gdb 出来,确认变量的信息是否正确,然后决定程序是否符合预期在执行。

可靠性的程序都有类似的保护机制,但是通常需要繁琐的构造测试条件,触发保护机制(如检测到丢包率很高,要告警等)。其实大多数的保护机制都是通过记录一些状态后,程序然后触发的保护机制。

其实,可以 gdb 构造出异常状态,确认告警机制是否生效。gdb 很好的补充这方面的测试和验证工作。

3) 关于统计

统计信息,是关键信息汇集的最好的例子。数据少,切信息明了。

电信软件中,很多模块都通过这样的信息:自证清白。也很容易发现问题出现哪里。

统计的实质,就是通过全局变量,记录一些程序正常,异常点的统计信息。然后通过某种手段输出出来。

4) 关于 coredump

大家看到 coredump 都会头痛,其实 coredump 也是很好的定位手段。

首先程序 coredump 后,会有详细的 coredump 文件,该文件详细的记录了程序在 core 之前的运行信息。gdb 这个 coredump 文件,你想看什么都可以。这只是简单的使用 coredump。

如果碰到复杂的问题,难搞的问题,其实也可以使用 coredump 来定位。

比如程序执行到一个十分不常见的代码分支,然后程序就 core 掉了,但是目前输出信息(日志等),根本没有办法进一步定位问题。

怎么办?有没有想过在复现问题的环节,出个调试版本的程序,在异常分支上主动触发内存异常,产生 coredump,利用 coredump 信息,来确定程序是如何异常的。

5) 关于代码修改

这个也是我常用的手段之一,反复的对比修改前后的代码,确认修改代码的准确性,全面性,反思自己代码修改是否全面?其实这里面工具就是 beyondcompare。

coding 数载,偶有所得,记录于此,望各位有所得!

作者:beck

内容
  • 浅析华为云Astro的5大关键能力技术
    浅析华为云Astro的5大关键能
    2023-12-11
    摘要: 本文以技术方案视角,对华为云Astro低代码平台的一些核心功能进行简要介绍。.背景介绍.低代码开发基于可视化开发
  • 什么是软件供应链?
    什么是软件供应链?
    2023-12-05
    1 软件供应链定义.需方和供方基于供应关系,开展并完成软件采购、开发、交付、获取、运维和废止等供应活动而形成的网链结构。
  • git 常用指令与简单规范
    git 常用指令与简单规范
    2023-12-04
    1. 前言.随着前端项目数量、前端开发人员、前端业务的日渐增多,则非常有必要整理一份简单的 git 规范,来进行项目开发
  • 2023你需要使用的最佳VSCode扩展
    2023你需要使用的最佳VSCo
    2023-12-02
    Visual Studio Code(VSCode)是一款广受欢迎的多功能代码编辑器,在最新的Stack.Overflo
  • 软件研发CI/CD流水线图解
    软件研发CI/CD流水线图解
    2023-12-02
    当谈到现代软件开发流程时,持续集成(Continuous Integration,简称CI)和持续交付(Continuo
  • 1.1 熟悉x64dbg调试器
    1.1 熟悉x64dbg调试器
    2023-12-02
    x64dbg.是一款开源、免费、功能强大的动态反汇编调试器,它能够在Windows平台上进行应用程序的反汇编、调试和分析
  • 4.4 x64dbg 绕过反调试保护机制
    4.4 x64dbg 绕过反调试
    2023-12-02
    在Windows平台下,应用程序为了保护自己不被调试器调试会通过各种方法限制进程调试自身,通常此类反调试技术会限制我们对
  • 代码管理工具git的使用
    代码管理工具git的使用
    2023-12-01
    1. git 概述.git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。也是Linu
  • 【OpenCV】在VS2017中配置OpenCV开发环境
    【OpenCV】在VS2017中
    2023-12-01
    开发环境:OpenCV4.5.4、VS2017、x64.打开属性管理器:视图–>其他窗口–>属性管理器.找到 Relea
  • 智能车载设备
    智能车载设备
    2023-10-02
    智能车载设备.我们的智能车载设备是一款结合了最新科技和创新设计的汽车配件,旨在提升驾驶体验、提高安全性和为用户带来智能化
  • 智能医疗设备
    智能医疗设备
    2023-10-02
    智能医疗设备产品介绍.智能医疗设备是一款集成了先进技术的高科技产品,旨在提高医疗保健的效率和质量。该设备主要应用于医院、
  • 互联网金融服务平台
    互联网金融服务平台
    2023-10-01
    互联网金融服务平台.产品功能.个人理财:用户可以通过平台进行投资理财,选择适合自己的理财产品,实现资金增值。.贷款服务:
  • 电子元件电感
    电子元件电感
    2023-10-02
    电子元件电感.产品功能.电感是一种重要的电子元件,用于储存和释放电能,调节电路中的电流和电压。它在电子设备和通讯设备中起
  • 智能智能家居设备
    智能智能家居设备
    2023-10-05
    智能家居设备介绍.产品概述.我们当前运营的产品是智能家居设备,它是一款智能化的家居控制系*,旨在为用户提供更便捷、舒适的
  • 智能可穿戴设备
    智能可穿戴设备
    2023-10-03
    产品功能介绍.我们的智能可穿戴设备是一款集健康监测、运动追踪、通讯互动等多种功能于一体的产品。它采用先进的传感技术,可实
  • 智能手机
    智能手机
    2023-10-01
    产品功能介绍:智能手机.智能手机是一款集通讯、娱乐、办公等功能于一体的移动智能设备。首先,智能手机具有强大的通讯功能,支
  • 智能智能物流设备
    智能智能物流设备
    2023-10-04
    智能物流设备.1. 产品描述.智能物流设备是一款基于物联网技术的智能设备,主要用于运输、储存和**物流货物。其核心功能是
  • 智能智能娱乐设备
    智能智能娱乐设备
    2023-10-04
    产品功能介绍.1. 智能娱乐设备.我们的智能娱乐设备是一款结合了智能技术和娱乐功能的产品。它拥有丰富的娱乐资源,包括音乐
  • 智能电视
    智能电视
    2023-10-01
    产品功能介绍.智能电视是一款结合了传统电视和智能硬件的产品。它内置了智能操作系*,能够连接互联网并运行各种应用程序。智能