0

0

Linux后台开发调试经验分享

星夢妙者

星夢妙者

发布时间:2025-04-19 20:42:50

|

351人浏览过

|

来源于php中文网

原创

在这篇文章中,beck分享了他在linux后台开发和调试领域的丰富经验。作为一名从事c语言开发超过十年的从业者,他详细介绍了调试的挑战和方法,并强调了开发过程中的关键阶段。

Linux后台开发调试经验分享作者:beck

毕业超过十年了,感慨岁月无情。作为一名从事后台开发多年的从业者(之前在电信领域工作),我将分享一些常见的开发心得和调试手段。多年使用互联网的经历让我收获颇丰,但总结的很少。秉承互联网精神,希望我的经验能帮助到互联网另一端的你。由于我主要从事C语言开发,以下经验也是基于C语言的调试手段。

调试是一个复杂而令人困扰的问题,很少有人能保证自己的代码完全没有错误。一旦发现问题,就需要进行调试。调试方法多种多样,从反汇编查看二进制代码,到使用gdb查看统计信息,再到简单的打印日志,甚至是自己制造bug让别人来查。掌握这些方法后,总能找到适合自己的调试方式。

调试的最终目的是找到BUG。一个高手曾打过一个有趣的比喻:你找BUG其实就像是福尔摩斯。你在BUG的“案发现场”寻找线索——合格的程序应该有日志、dump内存、计数等基本信息。如果什么都没有,只能找写代码的人自己查。调试就是在众多信息中抽丝剥茧,找到疑点,反复推演程序运行的代码,最终定位到那几行“作案”的代码。

这个过程非常折磨人,没有任何眉目时,令人茶饭不思。但一旦找到问题,就像打了鸡血般兴奋,甚至会陶醉其中。只有真正经历过这种折磨的人,才能体会到修改问题的快感。

开发的程序通常要经过两个阶段,最终才能上线发布。

在功能开发阶段,主要目标是根据业务需求开发程序。仅仅是写if else吗?写程序绝不仅仅如此。如果只是这样,开发人员的工作将变得更加枯燥和机械化。

做事都讲究未雨绸缪,开发程序更应该如此。大学C语言经典教材中定义程序为:程序 = 数据结构 + 算法。但在实际生产过程中,我认为更合适的定义是:程序 = 数据结构 + 算法 + 业务逻辑(计算逻辑)+ 框架。

补充业务逻辑的原因是有意义的程序本身就是某种业务逻辑(计算逻辑)的抽象。完成这个业务逻辑才是最终目的,不要拿一些算法研究的代码与我争论。

作为开发人员,测试驱动开发(TDD)是一种很好的思考问题的方式。也许有人听说过,也许有人用过,如果你觉得使用效果不佳,我可以告诉大家:应该采用测试场景 + 场景驱动开发。是的,仅仅是加入“场景”这个宾语,就能让开发更有目的性和针对性。

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

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

开发阶段的关键词总结为:TDD + 迭代。需要更多详情的同学可以自行百度谷歌

Linux后台开发调试经验分享在功能调试阶段,调试手段有很多,包括走读代码、打日志、使用gdb、统计、coredump等,如果有精力也可以进行白盒测试。测试的意图很明确,就是确认代码是否按照正确的编码意图运行。自己写的代码,调试起来相对容易,因为你清楚代码的本意该如何运行,现在出现了什么问题。

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

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

以上说的很多只是为了说明调试的前提和初衷。一个优秀的程序员会掌握很多调试技巧,也就是很多调试手段来获取自己想要的信息。获取的信息越多,就越容易理解程序本身的意图。

调试工具的使用细节和说明,读者可以自行百度、谷歌。

以下是我简单阐述自己是如何调试程序的,以及如何理解各种工具的,欢迎各位大虾指点交流:

1) 关于日志如何打好日志绝对是一门学问。日志打印太多会影响后台程序的性能,打印太少则无法定位问题。更糟糕的是打印到空指针,可能导致程序coredump。

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

如何做到少,就是汇聚。

企站帮微商城系统Access版
企站帮微商城系统Access版

OdnShop(原企站帮微商城系统,更名为OdnShop),基于ASP.NET 4.0+Access开发的轻量级微信商城系统,前台简洁美观,后台容易操作。系统容易部署,空间成本低,大部分的几百块一年的虚拟主机均可支持(具体请咨询空间商),适合要求不高,预算不多的小商店,小企业初次尝试微信线上销售产品,目前基本的核心功能,包括微信登陆/支付,产品管理,购物车与订单管理,分享获取积分,积分礼品兑换功能

下载

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

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

能否不打?

能否在内存中记录关键信息,在需要时控制其打印时机?

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

方法很多,大家多多思考。并且打印的优化是一个反复优化的过程,不是马上就能完成的。曾经遇到过一个大牛,测试部提出问题时,他从不亲自定位,而是直接让测试的兄弟执行软调,将收集的日志给他分析就能解决问题。

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

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

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

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

3) 关于统计统计信息是关键信息汇集的最好例子。数据少,信息明确。

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

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

4) 关于coredump大家看到coredump都会头痛,但coredump也是很好的定位手段。

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

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

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

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

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

从事编程多年,偶有所得,记录于此,希望各位有所收获!

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

377

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

603

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

348

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

255

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

578

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

515

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

627

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

595

2023.09.22

苹果官网入口直接访问
苹果官网入口直接访问

苹果官网直接访问入口是https://www.apple.com/cn/,该页面具备0.8秒首屏渲染、HTTP/3与Brotli加速、WebP+AVIF双格式图片、免登录浏览全参数等特性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

10

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 5.9万人学习

Git 教程
Git 教程

共21课时 | 2.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号