下服务器端开发流程及相关工具介绍(C++)

📅 2026/7/5 13:41:50
下服务器端开发流程及相关工具介绍(C++)
去年刚毕业来公司后做为新人发现很多东西都没有文档各种工具和地址都是口口相传的而且很多时候都是不知道有哪些工具可以使用所以当时就想把自己接触到的这些东西记录下来为后来者提供参考相当于一个路线图帮助新人尽快上手。本文介绍的我所在小组的一些开发流程及相关工具。做为新人入门手册其中某些工具可能只有我们这边在用但对于其他公司的新人来说一样是具有指导意义的。2015.4.11 更新:增加构建工具 Bazel, CMake介绍增加Linux下任务管理相关命令增加正则表达式调试的网址简单介绍一下我们组的开发背景我们的业务对外是一个http的服务开发主要是服务器端开发。编程语言基本以C/Java为主有少量的perl, shell的脚本程序发布部署方式通过ABS来打出rpm包放到公司内部yum源然后通过金字塔来进行自动化发布的熟悉Linux操作任务管理有时候你在命令行里执行拷贝大文件的命令这个命令很耗时会独占终端此时可以先使用Ctrlz命令让当前任务(job)挂起此时可以输入命令了然后使用bg命令让当前挂起的任务去后台(background)运行。利用jobs命令可以查看当前在后台运行的程序及job-id然后想让它到前台来运行可以执行fg [%job-id]来让它恢复到前台执行如果想kill掉当前在后台运行的某个任务怎么办使用kill %job-id开发环境搭建我们这边操作系统都是Red Hat Enterprise Linux 5,机器都是X86架构64位机器。这边代码文件默认都用GBK的编码登录机器的配置集团的跳板机ssh的配置是会在一段时间不操作之后自动断掉的而且每次登录上去都需要输入密码token利用ssh的ControlMaster,就可以解决方法见我的ssh配置在linux下有很多窗口管理器可以在一个窗口里进行多个独立的会话[不需要开多个终端]进行会话恢复[即使网络连接中断用户也不会失去对已经打开的命令行会话的控制]推荐screen默认的screen配置有些蹩脚而且跟shell快捷键有些冲突。配置好了之后界面显示就很强大了,可以参考我的screen配置对应上述配置的screen快捷键Ctrlj,c创建新会话Ctrlj,ddetachGNU工具链在刻的操作系统里已经有了常用的是* GNU make: 编译(compile)和构建(build)的自动化工具* GNU 编译器集合GCC* GNU 二进制工具:包含链接器(linker)汇编器(assembler)和其他工具代码编辑我一开始使用的vim基本不安装什么插件后来投入了emacs的怀抱主要是emacseshell和gdb搭配起来不仅能够满足我的日常需求而且让我感觉效率大大提升而且emacs环境安装也比较简单。但是在咋们公司的服务器上vim是标配emacs需要自己装。用习惯了emacs再切回到vim时好多快捷键都忘了十分痛苦Vim新手入门资料和一些Vim实用小技巧Linux环境下shell和vim中乱码原因及消除办法 新手经常被乱码问题困扰这篇文章探究了一下shell和vim中乱码原因及解决办法emacs安装及使用 现在这里挖个坑吧后续有时间再写如果在Windows下看代码推荐Source Insight,非常好用谁用谁知道。代码版本管理目前直通车这边代码版本管理使用svn常用命令:查看本地代码做了哪些改动svn st -q提交代码svn ci filepath/ -m svn comments查看另个版本之间的改动有哪些svn diff -r r1:r2svn diff -r r1:r1 --summarize#此命令是摘要模式只展示哪些文件改动不展示具体的文件内容diff创建分支svn cp http://destpath/trunk http://destpath/branches/my-branch/ -m create branche for xxx合并分支代码到主干svn merge -r 14829:HEAD my/branch http://path/to/trunk上述命令表示把本地的my/branch所代表的svn路径的14829到最新版本的代码merge到http://path/to/trunk路径下。如果是正常拉出来的分支也可以不加版本参数svn能自动计算出分支的起始版本号新人合并代码的时候一定要注意一下提交之前再确认下合并的代码是否OK如果有不明白的地方多请教师兄查看某段代码最后是谁改的svn blame filename更新指定文件到某个指定的版本svn up -r rev file撤销某文件本地的改动svn revert file#这条命令要谨慎使用使用之后自己的改动就找不回来了解决冲突的命令如果svn merger后提示:local add, incoming add upon merge用如下命令来采纳本地的修改来解决:svn resolve --accept working -R [--recursive]在Mac下推荐使用图形界面的Meld来作为svn的merge工具可以很方便的处理冲突减少合错代码的可能性开发[被测试戏谑为写bug的阶段]开发之前最好了解如下这些东东Makefile 用来完成自动化编译的东东相关资料可以参考陈皓写的跟我一起写 Makefile系列,网上可以搜到热心网友整理的pdf版本。看完前面4章就够用了后面的章节可以在遇到疑惑的时候再去查阅。可以通过以下几个常见问题来检验自己有没有理解整个工程的Makefile如何修改Makefile来编译出带/不带gdb调试信息的版本如何去掉加上编译器优化选项如-O2参数新加入头文件(一般都是.h结尾的)源文件(一般都是.cpp结尾)后如何在Makefile中加入相应的规则。新加入的这个文件可能最终是放到静态库.a里面也可能是放到动态库.so里面也可能是直接生成可执行程序的一般都不直接写makefile而是使用cmake(cross platform make)来生成makefile然后再按照make的方式构建软件。进阶读物如何调试Makefile变量关于静态库和动态库需要了解的东西有What: 什么是静态库什么是动态库How: 如何生成静态库,动态库Why: 静态库和动态库的差异什么情况下使用静态库什么情况下使用动态库以上问题都可以在LibraryArchives-StaticAndDynamic,shared libraries里得到解答参考资料菜鸟在C语言编译链接时可能遇到的两个问题编程大牛云风推荐的书 程序员的自我修养--链接、装载与库编程大牛老赵推荐的书 深入理解计算机系统书很厚可以挑着看自己关心的章节GNU编译工具GCC至少需要知道一些常用的选项参数定义输出文件的名称产生gdb调试的信息控制代码优化级别只进行预处理过程 可以帮助调试一些宏定义/头文件包含产生的问题只进行编译过程只进行链接过程可以通过man gcc来获得上述问题的答案,也可以自行googlegoogle被墙了可以用这个askGNU调试器gdb程序执行结果错误怎么办单测过不了怎么办线上出Core了怎么办别着急GDB来帮你忙。新手如何在gdb中存活 通过一个小例子来让新手快速上手,搞会了里面的内容就基本够用了GDB中应该知道的几个调试方法一些我搜刮到的gdb命令[会持续更新进来欢迎大家回复]查看指针数组中的内容p /x *addresslen以16进制方式显示address开头的len个元素通过gdb启动程序后如何调试fork出来的子进程set follow-fork-mode child直通车这边的服务基本都是多进程的模型首先启动一个daemon父进程然后再fork出多个执行业务逻辑的子进程。如果子进程挂掉父进程会重启一个子进程。进阶读物陈皓的 用GDB调试程序系列 介绍的非常详细全面多线程支持目前直通车这边多线程机制使用的都是POSIX Theads对于POSIX Theads需要了解What:什么是threadpthreadHow: 如何使用pthread如何编译多线程程序如何创建结束线程如何等待子线程返回(join/detach)多线程之间如何使用互斥锁(Mutex)来同步、加锁、避免竞争条件的出现Why: 为什么使用pthread,而不是其他以上问题都可以在这个美国劳伦斯利弗莫尔国家实验室的pthead教程里面找到答案查找/替换字符串/查找文件/文本处理想查找某个宏/函数的定义怎么办grep -r --include*.{cpp,h} NGX_HTTP_VAR_INDEXED src/本命令的意思是在src目录下以递归的方式在.cpp或者.h结尾的文件里查找NGX_HTTP_VAR_INDEXED这个字符串想找某个模糊记得名字的文件怎么办find ./ -iname *util.h本命令意思是在当前目录下,基于忽略大小写的文件名称来查找文件文件名称是正则表达式 *util.h关于正则表达式我只看deerchao的这个文章正则表达式30分钟入门教程另外有一个web应用regexr特别好使可以帮助我们调试正则表达式文本处理流式编辑器 sed例如替换某字符串:sed -i s/oldvalue/newvalue/g关于sed,可以看酷壳上的sed 简明教程文本处理语言 awk关于sed,可以看酷壳上的AWK 简明教程进阶读物应该知道的Linux技巧28个Unix/Linux的命令行神器关于单测(unit test)单测十分重要,它能够让你对你的代码更加有底气和信心而且能够帮助你更早的发现问题解决问题。在开发的各个阶段问题发现的越晚解决问题的成本就越大。这边C的单测都用的Google的gtest框架,即使之前不了解gtest框架看着别人的代码照猫画虎也可以写出单测来但是最好去看一下gtest官方文档去全面了解一下gtest去拓展一下自己的思维。写着写着代码就发现自己的代码越来越复杂不容易阅读设计混乱怎么办可以参考这本巨著代码大全第二版编译(compile),构建(build)