用C++語(yǔ)言做Linux開(kāi)發(fā)工具之編譯器和調(diào)試器選擇要素
編譯和調(diào)試往往成為編輯中重要的兩點(diǎn),所以對(duì)于編譯器和調(diào)試器的選擇就變得至關(guān)重要了,今天我們就告訴大家用C++語(yǔ)言做Linux開(kāi)發(fā)工具之編譯器和調(diào)試器選擇要素,以便大家更效率的進(jìn)行開(kāi)發(fā)
編譯器
用C++語(yǔ)言做Linux開(kāi)發(fā)工具編譯器首選GCC(GNU COMPILER COLLECTION)。原因有兩個(gè),它是GNU開(kāi)源的,同時(shí)它對(duì)標(biāo)準(zhǔn)C++的支持度高達(dá)96.15%。而VC++6.0的支持度只有83.43%。 GCC不僅是通常意義上的C或C++的編譯器,它還可以編譯java等其它語(yǔ)言。gcc是gnu c的編譯器,g++是gnu c++的編譯器, 而EGCS(Enhanced GNU Compiler Suite)可以認(rèn)為是gcc的改進(jìn)版。
編譯語(yǔ)言從源程序到目標(biāo)代碼會(huì)經(jīng)過(guò)如下幾個(gè)階段:源程序->匯編程序->編譯成obj程序->鏈接成最終可執(zhí)行程序。我們可以通過(guò)一條編譯指令來(lái)完成所有步驟。也可以分步執(zhí)行。gcc有三個(gè)重要選項(xiàng)-E(只進(jìn)行預(yù)處理), -S(生成匯編代碼), -g(生成帶原代碼調(diào)試符號(hào)的可執(zhí)行文件,如果想用gdb調(diào)試的話,就應(yīng)該在編譯時(shí)打開(kāi)這個(gè)選項(xiàng))。
用C++語(yǔ)言做Linux開(kāi)發(fā)工具GCC可以看作一個(gè)軟件包,除了編譯工具,它還集成了調(diào)試器gdb,性能分析工具gcov, gprof。只要我們裝好了GCC,這些強(qiáng)大工具就可以直接使用了。
通過(guò)gcov,我們可以查看一個(gè)程序,源代碼中每行代碼的運(yùn)行次數(shù)。我們優(yōu)化運(yùn)行次數(shù)最多的代碼,那么就可以大大優(yōu)化程序。使用gcov時(shí),需要打開(kāi) GCC的fprofile-arcs和ftest-coverage兩個(gè)選項(xiàng)。gcov中常用的選項(xiàng)有-b分支統(tǒng)計(jì)信息。
通過(guò)gprof工具,我們可以查看函數(shù)之間的調(diào)用順序,及各個(gè)函數(shù)運(yùn)行的時(shí)間。我們可以將gprof理解為linux/unix自帶工具time的加強(qiáng)版。使用gprof時(shí),需要打開(kāi)GCC的pg選項(xiàng)。
gcov和 gprof的共同點(diǎn)是在編譯程序時(shí),加入自己的一些輔助信息,由此來(lái)進(jìn)行程序診斷。除了,這些優(yōu)化手段,我們還可以使用一些內(nèi)存泄漏工具,來(lái)減少野指針,未釋放的內(nèi)存空間。
調(diào)試器
用C++語(yǔ)言做Linux開(kāi)發(fā)工具GDB即GNU的調(diào)試器,它是GCC附帶的一個(gè)性能優(yōu)質(zhì)的調(diào)試器。通過(guò)GDB和腳本結(jié)合,我們可以很好的實(shí)現(xiàn)回歸測(cè)試。
用C++語(yǔ)言做Linux開(kāi)發(fā)工具GDB可以運(yùn)行于CLI和GUI兩種模式。默認(rèn)GDB是CLI模式的,我們可以去下載和安裝GUI模式的GDB,例如xxgdb, ddd等。一個(gè)更好的方式是在 EMACS中使用GDB。GDB包括visual studio工具的所有調(diào)試功能,還包括它沒(méi)有的功能。它除了支持,我們一般的設(shè)置斷點(diǎn),單步跟蹤,step in, step out, step over等,還有一些強(qiáng)大的功能。在gdb中,我們可以有以下幾種暫停方式:斷點(diǎn)(BreakPoint)、觀察點(diǎn)(WatchPoint)、捕捉點(diǎn)(CatchPoint)、信號(hào)(Signals)、線程停止(Thread Stops)。
下面列舉幾個(gè)讓我印象深刻的功能。1)通過(guò) watch指令,可以讓程序在某個(gè)變量的值發(fā)生變化時(shí),暫停下來(lái)。2)通過(guò)print指令,在程序運(yùn)行時(shí),設(shè)置變量的值,運(yùn)行一個(gè)程序自身支持的一個(gè)方法。3)通過(guò)until指令,我們可以讓程序在運(yùn)行到某個(gè)程序時(shí)暫停下來(lái)。4)通過(guò)break.. if指令,使得程序在滿足某個(gè)bool表達(dá)式時(shí),暫停下來(lái)。
【編輯推薦】