去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把自己接触到的这些东西记录下来,为后来者提供参考,相当于一个路线图,帮助新人尽快上手。

本文介绍的我所在小组的一些开发流程及相关工具。做为新人入门手册,其中某些工具可能只有我们这边在用,但对于其他公司的新人来说,一样是具有指导意义的。

2015.4.11 更新:

  1. 增加构建工具 Bazel, CMake介绍
  2. 增加Linux下任务管理相关命令
  3. 增加正则表达式调试的网址

简单介绍一下我们组的开发背景:
我们的业务对外是一个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的编码

  1. 登录机器的配置
    集团的跳板机,ssh的配置是会在一段时间不操作之后自动断掉的,而且每次登录上去都需要输入密码+token,利用ssh的ControlMaster,就可以解决,方法见我的ssh配置

    在linux下,有很多窗口管理器,可以在一个窗口里进行多个独立的会话[不需要开多个终端],进行会话恢复[即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制],推荐screen

    默认的screen配置有些蹩脚,而且跟shell快捷键有些冲突。配置好了之后界面显示就很强大了,可以参考我的screen配置
    对应上述配置的screen快捷键:
    Ctrl+j,c 创建新会话
    Ctrl+j,d detach

  2. GNU工具链

    在刻的操作系统里已经有了,常用的是:
    * GNU make: 编译(compile)和构建(build)的自动化工具
    * GNU 编译器集合:GCC
    * GNU 二进制工具:包含链接器(linker),汇编器(assembler)和其他工具

  3. 代码编辑

    我一开始使用的vim,基本不安装什么插件,后来投入了emacs的怀抱,主要是emacs,eshell和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: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

    1. 如何修改Makefile来编译出带/不带gdb调试信息的版本
    2. 如何去掉/加上编译器优化选项,如-O2参数
    3. 新加入头文件(一般都是.h结尾的),源文件(一般都是.cpp结尾)后,如何在Makefile中加入相应的规则。新加入的这个文件可能最终是放到静态库.a里面,也可能是放到动态库.so里面,也可能是直接生成可执行程序的

    一般都不直接写makefile,而是使用cmake(cross platform make)来生成makefile,然后再按照make的方式构建软件。

    进阶读物:
    如何调试Makefile变量

  • 关于静态库和动态库

    需要了解的东西有

    1. What: 什么是静态库,什么是动态库
    2. How: 如何生成静态库,动态库
    3. Why: 静态库和动态库的差异,什么情况下使用静态库,什么情况下使用动态库
      以上问题都可以在LibraryArchives-StaticAndDynamic,shared libraries里得到解答

参考资料:

  1. 菜鸟在C语言编译,链接时可能遇到的两个问题

  2. 编程大牛云风推荐的书 <>

  3. 编程大牛老赵推荐的书 <>书很厚,可以挑着看自己关心的章节

  • GNU编译工具GCC

    至少需要知道一些常用的选项参数:

    1. 定义输出文件的名称
    2. 产生gdb调试的信息
    3. 控制代码优化级别
    4. 只进行预处理过程 可以帮助调试一些宏定义/头文件包含产生的问题
    5. 只进行编译过程
    6. 只进行链接过程

    可以通过man gcc来获得上述问题的答案,也可以自行google,google被墙了可以用这个ask

  • GNU调试器gdb
    程序执行结果错误怎么办?单测过不了怎么办?线上出Core了怎么办?别着急,GDB来帮你忙。

    新手如何在gdb中存活 通过一个小例子来让新手快速上手,搞会了里面的内容,就基本够用了

    GDB中应该知道的几个调试方法

    一些我搜刮到的gdb命令[会持续更新进来,欢迎大家回复]:

    • 查看指针数组中的内容 __p /x *address@len__ 以16进制方式显示address开头的len个元素
    • 通过gdb启动程序后,如何调试fork出来的子进程:set follow-fork-mode child

      直通车这边的服务基本都是多进程的模型,首先启动一个daemon父进程,然后再fork出多个执行业务逻辑的子进程。如果子进程挂掉,父进程会重启一个子进程。

    进阶读物:

    陈皓的 用GDB调试程序系列, 介绍的非常详细,全面

多线程支持

目前直通车这边多线程机制使用的都是POSIX Theads

对于POSIX Theads,需要了解:

  1. What:什么是thread,pthread
  2. How: 如何使用pthread
    • 如何编译多线程程序
    • 如何创建/结束线程
    • 如何等待子线程返回(join/detach)
    • 多线程之间如何使用互斥锁(Mutex)来同步、加锁、避免竞争条件的出现?
  3. 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 简明教程

进阶读物:

  1. 应该知道的Linux技巧
  2. 28个Unix/Linux的命令行神器

关于单测(unit test)

单测十分重要,它能够让你对你的代码更加有底气和信心,而且能够帮助你更早的发现问题,解决问题。在开发的各个阶段,问题发现的越晚,解决问题的成本就越大。这边C++的单测都用的Google的gtest框架,即使之前不了解gtest框架,看着别人的代码照猫画虎也可以写出单测来,但是最好去看一下gtest官方文档,去全面了解一下gtest,去拓展一下自己的思维。

写着写着代码,就发现自己的代码越来越复杂,不容易阅读,设计混乱怎么办?可以参考这本巨著:
<>

编译(compile),构建(build)

  1. 编译之前的准备工作

    需要把编译依赖环境搞定,基本就是装好编译依赖的包就可以了。可以在rpm目录下找到对应的spec文件,然后使用 t-abs 命令[用于本地调试spec文件和自动部署编译环境],来帮助我们装好编译依赖的包,即spec文件中的 BuildRequire 部分指定的包

    关于rpm和spec文件,可以通过阅读这篇来了解:How to create an RPM package

  2. 编译

    找到对应工程的Makefile,然后执行make命令,就可以编译构建工程了

    由于make本身的灵活性,而Makefile的可读性又不强,是以文件为单元,抽象层次不够,Google开发了分布式的构建系统Bazel,能够把程序员从make的语法和文件级别的构建上解放出来。

    Bazel相关资料有:
    Google Blaze原理及 Bazel的使用方法介绍

目前我们这边目前还在用RPM来进行包的管理

  • 平常需要用到的rpm命令有:

    1. rpm -qf file-name 来查看某个文件到底是哪个rpm包里面的
    2. rpm -qi package-name 来查看这个rpm包相关的信息,比如打包时间,svn地址等
    3. rpm -ql package-name 来查看这个rpm包中到底有哪些文件
    4. 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


如果您看了本篇博客,觉得对您有所收获,请点击右下角的“推荐”,让更多人看到!

资助Jack47写作,打赏一个鸡蛋灌饼钱吧
微信打赏
支付宝打赏

Linux下服务器端开发流程及相关工具介绍(C++)的更多相关文章

  1. (转)Linux下C++开发初探

    1.开发工具 Windows下,开发工具多以集成开发环境IDE的形式展现给最终用户.例如,VS2008集成了编辑器,宏汇编ml,C /C++编译器cl,资源编译器rc,调试器,文档生成工具, nmak ...

  2. 【转载】Visual Studio 2015 for Linux更好地支持Linux下的开发

    原文:Visual Studio 2015 for Linux更好地支持Linux下的开发 英文原文:Targeting Linux Made Easier in Visual Studio 2015 ...

  3. linux下C++开发工具

    就C++开发工具而言,与Windows下微软(VC, VS2005等)一统天下相比,Linux/Unix下C++开发,可谓五花八门,各式各样.Emacs, vi, eclipse, anjuta,kd ...

  4. Linux下golang开发环境搭建

    对于golang开发来说,Windows下可以用vscode或者liteide都不错,但是Linux下的开发也就只有vim了,所以怎么搞笑的利用vim进行golang开发呢? 参考官方推荐的一个插件: ...

  5. Linux下c开发 之 线程通信(转)

    Linux下c开发 之 线程通信(转) 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linu ...

  6. deepin linux 下C开发环境配置

    # deepin linux 下C开发环境配置 ## 前言-----------------------------deepin操作系统商店默认提供了 eclipse for c\c++但是系统没有提 ...

  7. Linux下c开发 之 线程通信

    Linux下c开发 之 线程通信 1.Linux“线程” 进程与线程之间是有区别的,不过Linux内核只提供了轻量进程的支持,未实现线程模型.Linux是一种“多进程单线程”的操作系统.Linux本身 ...

  8. 深入理解 JavaScript,以及 Linux 下的开发调试工具

    前言 JavaScript 是我接触到的第二门编程语言,第一门是 C 语言.然后才是 C++.Java 还有其它一些什么.所以我对 JavaScript 是非常有感情的,毕竟使用它有十多年了.早就想写 ...

  9. linux 下各文件夹的功能性介绍。(转载)

    原文来自:http://www.cnblogs.com/wen858636827/archive/2012/12/26/2834373.html /opt   放置用户自己下载的软件  英文全称是op ...

随机推荐

  1. 01.SQLServer性能优化之----强大的文件组----分盘存储

    汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...

  2. 猫哥网络编程系列:HTTP PEM 万能调试法

    注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...

  3. 重撸JS_1

    1.声明 用 var 或 let 声明的未赋初值的变量,值会被设定为undefined(译注:即未定义值,本身也是一个值) 试图访问一个未初始化的变量会导致一个 ReferenceError 异常被抛 ...

  4. Python标准模块--Iterators和Generators

    1 模块简介 当你开始使用Python编程时,你或许已经使用了iterators(迭代器)和generators(生成器),你当时可能并没有意识到.在本篇博文中,我们将会学习迭代器和生成器是什么.当然 ...

  5. 视频 - 在 VirtualBox 中部署 OpenStack

    大家新年好,CloudMan 今天给大家带来一件新年礼物. 一直以来大家都反馈 OpenStack 学习有两大障碍:1. 实验环境难搭2. 体系复杂,难道大今天我就先帮大家解决环境问题.前两天我抽空在 ...

  6. JAVA GUI编程学习笔记目录

    2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...

  7. javascript动画系列第一篇——模拟拖拽

    × 目录 [1]原理介绍 [2]代码实现 [3]代码优化[4]拖拽冲突[5]IE兼容 前面的话 从本文开始,介绍javascript动画系列.javascript本身是具有原生拖放功能的,但是由于兼容 ...

  8. JavaScript知识结构图

    画的一个知识结构图,方便理解.

  9. ASP.NET Core MVC 配置全局路由前缀

    前言 大家好,今天给大家介绍一个 ASP.NET Core MVC 的一个新特性,给全局路由添加统一前缀.严格说其实不算是新特性,不过是Core MVC特有的. 应用背景 不知道大家在做 Web Ap ...

  10. dhcp协议交互报文

    DHCP共有八种报文,分别为DHCP Discover.DHCP Offer.DHCP Request.DHCP ACK.DHCP NAK.DHCP Release.DHCP Decline.DHCP ...