Linux下服务器端开发流程及相关工具介绍(C++)
去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路线图,帮助新人尽快上手。
本文介绍的我所在小组的一些开发流程及相关工具。做为新人入门手册,其中某些工具可能只有我们这边在用,但对于其他公司的新人来说,一样是具有指导意义的。
2015.4.11 更新:
- 增加构建工具 Bazel, CMake介绍
- 增加Linux下任务管理相关命令
- 增加正则表达式调试的网址
简单介绍一下我们组的开发背景:
我们的业务对外是一个http的服务,开发主要是服务器端开发。
编程语言:基本以C++/Java为主,有少量的perl, shell的脚本
程序发布,部署方式:通过 ABS 来打出rpm包,放到公司内部 yum 源,然后通过 金字塔 来进行自动化发布的
熟悉Linux操作
任务管理
有时候你在命令行里执行拷贝大文件的命令,这个命令很耗时,会独占终端,此时可以先使用 Ctrl+z 命令让当前任务(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快捷键:
Ctrl+j,c 创建新会话
Ctrl+j,d detach-
在刻的操作系统里已经有了,常用的是:
* GNU make: 编译(compile)和构建(build)的自动化工具
* GNU 编译器集合:GCC
* GNU 二进制工具:包含链接器(linker),汇编器(assembler)和其他工具 代码编辑
我一开始使用的vim,基本不安装什么插件,后来投入了emacs的怀抱,主要是emacs,eshell和gdb搭配起来,不仅能够满足我的日常需求,而且让我感觉效率大大提升,而且emacs环境安装也比较简单。但是在咋们公司的服务器上,vim是标配,emacs需要自己装。用习惯了emacs,再切回到vim时,好多快捷键都忘了,十分痛苦!
Linux环境下shell和vim中乱码原因及消除办法 新手经常被乱码问题困扰,这篇文章探究了一下shell和vim中乱码原因及解决办法
emacs安装及使用 ,现在这里挖个坑吧,后续有时间再写
如果在Windows下看代码,推荐Source Insight,非常好用,谁用谁知道。
代码版本管理
目前直通车这边代码版本管理使用svn
常用命令:
查看本地代码做了哪些改动
svn st -q提交代码
svn ci filepath/ -m "svn comments"查看另个版本之间的改动有哪些
svn diff -r r1:r2
svn 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里得到解答
参考资料:
-
至少需要知道一些常用的选项参数:
- 定义输出文件的名称
- 产生gdb调试的信息
- 控制代码优化级别
- 只进行预处理过程 可以帮助调试一些宏定义/头文件包含产生的问题
- 只进行编译过程
- 只进行链接过程
可以通过man gcc来获得上述问题的答案,也可以自行google,google被墙了可以用这个ask
GNU调试器gdb
程序执行结果错误怎么办?单测过不了怎么办?线上出Core了怎么办?别着急,GDB来帮你忙。新手如何在gdb中存活 通过一个小例子来让新手快速上手,搞会了里面的内容,就基本够用了
一些我搜刮到的gdb命令[会持续更新进来,欢迎大家回复]:
- 查看指针数组中的内容 __p /x *address@len__ 以16进制方式显示address开头的len个元素
通过gdb启动程序后,如何调试fork出来的子进程:set follow-fork-mode child
直通车这边的服务基本都是多进程的模型,首先启动一个daemon父进程,然后再fork出多个执行业务逻辑的子进程。如果子进程挂掉,父进程会重启一个子进程。
进阶读物:
陈皓的 用GDB调试程序系列, 介绍的非常详细,全面
多线程支持
目前直通车这边多线程机制使用的都是POSIX Theads
对于POSIX Theads,需要了解:
- What:什么是thread,pthread
- How: 如何使用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 简明教程
进阶读物:
关于单测(unit test)
单测十分重要,它能够让你对你的代码更加有底气和信心,而且能够帮助你更早的发现问题,解决问题。在开发的各个阶段,问题发现的越晚,解决问题的成本就越大。这边C++的单测都用的Google的gtest框架,即使之前不了解gtest框架,看着别人的代码照猫画虎也可以写出单测来,但是最好去看一下gtest官方文档,去全面了解一下gtest,去拓展一下自己的思维。
写着写着代码,就发现自己的代码越来越复杂,不容易阅读,设计混乱怎么办?可以参考这本巨著:
<>
编译(compile),构建(build)
编译之前的准备工作
需要把编译依赖环境搞定,基本就是装好编译依赖的包就可以了。可以在rpm目录下找到对应的spec文件,然后使用 t-abs 命令[用于本地调试spec文件和自动部署编译环境],来帮助我们装好编译依赖的包,即spec文件中的 BuildRequire 部分指定的包
关于rpm和spec文件,可以通过阅读这篇来了解:How to create an RPM package
编译
找到对应工程的Makefile,然后执行make命令,就可以编译构建工程了
由于make本身的灵活性,而Makefile的可读性又不强,是以文件为单元,抽象层次不够,Google开发了分布式的构建系统Bazel,能够把程序员从make的语法和文件级别的构建上解放出来。
Bazel相关资料有:
Google Blaze原理及 Bazel的使用方法介绍
目前我们这边目前还在用RPM来进行包的管理
- 平常需要用到的rpm命令有:
- rpm -qf file-name 来查看某个文件到底是哪个rpm包里面的
- rpm -qi package-name 来查看这个rpm包相关的信息,比如打包时间,svn地址等
- rpm -ql package-name 来查看这个rpm包中到底有哪些文件
- rpm -qV package-name 来验证这个rpm包安装后的文件有没有被修改过, 在怀疑rpm包的配置/脚本被人修改过的时候非常有用
代码review
UI界面:reviewboard,提交的时候使用 rbt命令:
rbt post r1 r2 来提交r1和r2这两个版本之间的diff做为code review
提交之后可以得到一个reviewboard地址,然后需要在这个地址里填上codereview的人员和相关的描述等
持续集成CISE
CISE为用户提供自动化的环境部署和测试服务
这块儿每个公司使用的都是不同各地
安装包
对于构建出来的rpm包,使用yum来安装。
淘宝rpm包查询UI 这里可以查看到淘宝yum源里面现存的各个包版本 可以从里面看到对应包的abs地址
使用如下命令安装:
sudo yum install -b test t-imatch-kgb-updated
-b 参数用来指定当前安装包t-imatch-kgb-updated在test分支还是current分支里面
上线时候的包必须转成current
如果您看了本篇博客,觉得对您有所收获,请点击右下角的“推荐”,让更多人看到!
Linux下服务器端开发流程及相关工具介绍(C++)的更多相关文章
- (转)Linux下C++开发初探
1.开发工具 Windows下,开发工具多以集成开发环境IDE的形式展现给最终用户.例如,VS2008集成了编辑器,宏汇编ml,C /C++编译器cl,资源编译器rc,调试器,文档生成工具, nmak ...
- 【转载】Visual Studio 2015 for Linux更好地支持Linux下的开发
原文:Visual Studio 2015 for Linux更好地支持Linux下的开发 英文原文:Targeting Linux Made Easier in Visual Studio 2015 ...
- linux下C++开发工具
就C++开发工具而言,与Windows下微软(VC, VS2005等)一统天下相比,Linux/Unix下C++开发,可谓五花八门,各式各样.Emacs, vi, eclipse, anjuta,kd ...
- Linux下golang开发环境搭建
对于golang开发来说,Windows下可以用vscode或者liteide都不错,但是Linux下的开发也就只有vim了,所以怎么搞笑的利用vim进行golang开发呢? 参考官方推荐的一个插件: ...
- Linux下c开发 之 线程通信(转)
Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...
- deepin linux 下C开发环境配置
# deepin linux 下C开发环境配置 ## 前言-----------------------------deepin操作系统商店默认提供了 eclipse for c\c++但是系统没有提 ...
- Linux下c开发 之 线程通信
Linux下c开发 之 线程通信 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身 ...
- 深入理解 JavaScript,以及 Linux 下的开发调试工具
前言 JavaScript 是我接触到的第二门编程语言,第一门是 C 语言.然后才是 C++.Java 还有其它一些什么.所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了.早就想写 ...
- linux 下各文件夹的功能性介绍。(转载)
原文来自:http://www.cnblogs.com/wen858636827/archive/2012/12/26/2834373.html /opt 放置用户自己下载的软件 英文全称是op ...
随机推荐
- node-webkit 环境搭建与基础demo
首先去github上面下载(地址),具体更具自己的系统,我的是windows,这里只给出windows的做法 下载windows x64版本 下载之后解压,得到以下东西 为了方便,我们直接在这个目录中 ...
- Travis CI用来持续集成你的项目
这里持续集成基于GitHub搭建的博客为项目 工具: zqz@ubuntu:~$ node --version v4.2.6 zqz@ubuntu:~$ git --version git versi ...
- 在传统.NET Framework 上运行ASP.NET Core项目
新的项目我们想用ASP.NET Core来开发,但是苦于我们历史的遗产很多,比如<使用 JavaScriptService 在.NET Core 里实现DES加密算法>,我们要估计等到.N ...
- Java多线程基础——对象及变量并发访问
在开发多线程程序时,如果每个多线程处理的事情都不一样,每个线程都互不相关,这样开发的过程就非常轻松.但是很多时候,多线程程序是需要同时访问同一个对象,或者变量的.这样,一个对象同时被多个线程访问,会出 ...
- Bringing Whoops Back to Laravel 5
You might be missing the "prettier" Whoops error handler from Laravel 4. If so, here's how ...
- 80 端口被占用 pid=4
80端口被pid=4的系统进程给占用的解决方法: 一般开发的时候我们都会安装sqlserver ,也会把Sql server Reporting Services 安装上去.原因就是这个服务占用了80 ...
- javascript单元测试框架mochajs详解
关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
- scala练习题1 基础知识
1, 在scala REPL中输入3. 然后按下tab键,有哪些方法可以被调用? 24个方法可以被调用, 8个基本类型: 基本的操作符, 等: 2,在scala REPL中,计算3的平方根,然 ...
- JDBC MySQL 多表关联查询查询
public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...