Linux下服務器端開發流程及相關工具介紹(C++)

去年剛畢業來公司後,做爲新人,發現很多東西都沒有文檔,各種工具和地址都是口口相傳的,而且很多時候都是不知道有哪些工具可以使用,所以當時就想把自己接觸到的這些東西記錄下來,爲後來者提供參考,相當於一個路線圖,幫助新人儘快上手。

本文介紹的是阿里媽媽搜索直通車這邊的一些開發流程及相關工具。做爲新人入門手冊,其中某些工具可能只有直通車這邊在用,但對於其他公司的新人來說,一樣是具有指導意義的。

簡單介紹一下直通車這邊的開發背景:

直通車業務對外是一個http的服務,直通車這邊的開發主要是服務器端開發。

編程語言:基本以C++/Java爲主,有少量的perl, shell的腳本

程序發佈,部署方式:通過 ABS 來打出rpm包,放到淘寶內部 yum 源,然後通過 金字塔 來進行自動化發佈的

開發環境搭建

直通車這邊操作系統都是 Red Hat Enterprise Linux 5 ,機器都是 X86架構 , 64位 機器。這邊代碼文件默認都用GBK的編碼

  1. 登錄機器的配置

    集團的跳板機,ssh的配置是會在一段時間不操作之後自動斷掉的,而且每次登錄上去都需要輸入密碼+token,利用ssh的ControlMaster,就可以解決,方法見我的 ssh配置

    在linux下,有很多窗口管理器,可以在一個窗口裏進行多個獨立的會話[不需要開多個終端],進行會話恢復[即使網絡連接中斷,用戶也不會失去對已經打開的命令行會話的控制],推薦 screen

    20150308123539867.png

    我的screen界面截圖

    默認的screen配置有些蹩腳,而且跟shell快捷鍵有些衝突。配置好了之後界面顯示就很強大了,可以參考我的 ssh配置

    對應上述配置的screen快捷鍵:

    Ctrl+j,c創建新會話

    Ctrl+j,ddetach

  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

    進階讀物:

    如何調試Makefile變量

  1. 如何修改Makefile來編譯出帶/不帶gdb調試信息的版本

  2. 如何去掉/加上編譯器優化選項,如-O2參數

  3. 新加入頭文件(一般都是.h結尾的),源文件(一般都是.cpp結尾)後,如何在Makefile中加入相應的規則。新加入的這個文件可能最終是放到靜態庫.a裏面,也可能是放到動態庫.so裏面,也可能是直接生成可執行程序的

關於靜態庫和動態庫

需要了解的東西有

1. What: 什麼是靜態庫,什麼是動態庫

2. How: 如何生成靜態庫,動態庫

3. Why: 靜態庫和動態庫的差異,什麼情況下使用靜態庫,什麼情況下使用動態庫

以上問題都可以在 這篇資料 裏得到解答

參考資料:

  1. 菜鳥在C語言編譯,鏈接時可能遇到的兩個問題

  2. 編程大牛 雲風推薦的書 < <程序員的自我修養--鏈接 裝載與庫=""> >

  3. 編程大牛老趙推薦的書 < <深入理解計算機系統> >( http://www.amazon.cn /mn/detailApp/ref=sr_1_2?_encoding=UTF8&s=books&qid=1258890021& amp;asin=B0011ATXIS&sr=8-2)書很厚,可以挑着看自己關心的章節

  • GNU編譯工具GCC

    至少需要知道一些常用的選項參數:

    可以通過man gcc來獲得上述問題的答案,也可以自行google,google被牆了可以用這個 ask

  1. 定義輸出文件的名稱

  2. 產生gdb調試的信息

  3. 控制代碼優化級別	
  4. 只進行預處理過程 可以幫助調試一些宏定義/頭文件包含產生的問題

  5. 只進行編譯過程

  6. 只進行鏈接過程

GNU調試器gdb程序執行結果錯誤怎麼辦?單測過不了怎麼辦?線上出Core了怎麼辦?彆着急,GDB來幫你忙。新手如何在gdb中存活 通過一個小例子來讓新手快速上手,搞會了裏面的內容,就基本夠用了GDB中應該知道的幾個調試方法一些我搜刮到的gdb命令[會持續更新進來,歡迎大家回覆]:進階讀物:陳皓的 用GDB調試程序系列 , 介紹的非常詳細,全面
  • 查看指針數組中的內容 __p /x_ 以16進制方式顯示address開頭的len個元素

  • 通過gdb啓動程序後,如何調試fork出來的子進程: set follow-fork-mode child

    直通車這邊的服務基本都是多進程的模型,首先啓動一個 daemon 父進程,然後再fork出多個執行業務邏輯的子進程。如果子進程掛掉,父進程會重啓一個子進程。

多線程支持

目前直通車這邊多線程機制使用的都是 POSIX Theads

對於POSIX Theads,需要了解:

  1. What:什麼是thread,pthread

  2. 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分鐘入門教程

  • 文本處理

    流式編輯器 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命令,就可以編譯構建工程了

直通車這邊目前還在用 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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章