一般源**提供的程式安裝需要通過配置、編譯、安裝三個步驟;
1. 配置做的工作主要是檢查當前環境是否滿足要安裝軟體的依賴關係,以及設定程式安裝所需要的初始化資訊,比如安裝路徑,需要安裝哪些元件;配置完成,會生成makefile檔案供第二步make使用;
2. 編譯是對原始檔進行編譯鏈結生成可執行程式;
3. 安裝做的工作就簡單多了,就是將生成的可執行檔案拷貝到配置時設定的初始路徑下;
查詢可用的配置選項:./configure --help
配置路徑:./configure --prefix=/usr/local/snmp
–prefix是配置使用的最常用選項,設定程式安裝的路徑;
編譯使用make編譯:make -f mymakefile
通過-f選項顯示指定需要編譯的makefile;如果待使用makefile檔案在當前路徑,且檔名為以下幾個,則不用顯示指定: makefile makefile
makefile編寫的要點:
必須滿足第一條規則,滿足後停止
除第一條規則,其他無順序
makefile中的全域性自變數
使用cmake,能夠使程式設計師從複雜的編譯連線過程中解脫出來。它使用乙個名為 cmakelists.txt 的檔案來描述構建過程,可以生成標準的構建檔案
makefile編譯過程中所依賴的非標準庫和標頭檔案路徑需要顯示指明:
cppflags -i標記非標準標頭檔案存放路徑如果cppflags和ldflags已在使用者環境變數中設定並且匯出(使用export關鍵字),就不用再顯示指定;ldflags -l標記非標準庫存放路徑
make -f mymakefile ldflags='-l/var/***/lib -l/opt/mysql/lib'
cppflags='-i/usr/local/libcom/include -i/usr/local/libpng/include'
警告:鏈結多庫時,多個庫之間如果有依賴,需要注意書寫的順序,右邊是左邊的前提;
選項說明:
-o:指明生成的目標檔案
-g:新增除錯資訊
-e: 檢視中間檔案
查詢應用程式需要鏈結的庫:ldd myprogrammer
安裝做的工作就簡單多了,就是將生成的可執行檔案拷貝到配置時設定的初始路徑下:make install
其實 install 就是makefile中的乙個規則,開啟makefile檔案後可以檢視程式安裝的所做的工作;
以下從乙個完整的除錯過程簡單說明最基本的幾個命令;
gdb programmer # 啟動gdbbreak main # 設定斷點
run # 執行除錯程式
next # 單步除錯
print var1 #在除錯過程中,我們需要檢視當前某個變數值的時候,使用print 命令列印該值
list # 顯示當前除錯處的源**
info b # 顯示當前斷點設定情況
strace常用來跟蹤程序執行時的系統呼叫和所接收的訊號。在linux世界,程序不能直接訪問硬體裝置,當程序需要訪問硬體裝置(比如讀取磁碟檔案,接收網路資料等等)時,必須由使用者態模式切換至核心態模式,通過系統呼叫訪問硬體裝置。strace可以跟蹤到乙個程序產生的系統呼叫,包括引數,返回值,執行消耗的時間。
strace -o output.txt -t -tt -e trace=all -p 28979
這個工具和objdump命令提供的功能類似,但是它顯示的資訊更為具體,並且它不依賴bfd庫(bfd庫是乙個gnu專案,它的目標就是希望通過一種統一的介面來處理不同的目標檔案)readelf -all a.out
size 用來檢視程式執行時各個段的實際記憶體占用:size a.out
乙個檔案中包含二進位制資料和文字資料,如果只需要檢視其文字資訊,使用這個命令就很方便;過濾掉非字元資料,將文字資訊輸出:strings
顯示所有正在使用著指定的file, file system 或者 sockets的程序資訊;
fuser -m -u redis-server
使用了-m和-u選項,用來查詢所有正在使用redis-server的所有程序的pid以及該程序的owner;
以十六進製制方式顯示檔案,只顯示文字資訊:xxd a.out
進入互動模式後:
•輸入m,程序列表按記憶體使用大小降序排序,便於我們觀察最大記憶體使用者使用有問題(檢測記憶體洩漏問題);
•輸入p,程序列表按cpu使用大小降序排序,便於我們觀察最耗cpu資源的使用者是否有問題;
top第三行顯示當前系統的,其中有兩個值很關鍵:
•%id:空閒cpu時間百分比,如果這個值過低,表明系統cpu存在瓶頸;
•%wa:等待i/o的cpu時間百分比,如果這個值過高,表明io存在瓶頸;
檢視記憶體是否存在瓶頸,使用top指令看比較麻煩,而free命令更為直觀:
top工具顯示了free工具的第一行所有資訊,但真實可用的記憶體,還需要自己計算才知道; 系統實際可用的記憶體為free工具輸出第二行的free+buffer+cached;也就是第三行的free值
如果io存在效能瓶頸,top工具中的%wa會偏高;進一步分析使用iostat工具:iostat -d -x -k 1 1
pstack用來跟蹤程序棧,這個命令在排查程序問題時非常有用,比如我們發現乙個服務一直處於work狀態(如假死狀態,好似死迴圈),使用這個命令就能輕鬆定位問題所在;可以在一段時間內,多執行幾次pstack,若發現**棧總是停在同乙個位置,那個位置就需要重點關注,很可能就是出問題的地方;
示例:檢視bash程式程序棧:ps -fe| grep bash
除錯記憶體洩漏的工具valgrind
oprofile 也是 linux 平台上的乙個功能強大的效能分析工具,
啟動gdb後,進入到互動模式,通過以下命令完成對程式的除錯;注意高頻使用的命令一般都會有縮寫,熟練使用這些縮寫命令能提高除錯的效率;
執行 •run:簡記為 r ,其作用是執行程式,當遇到斷點後,程式會在斷點處停止執行,等待使用者輸入下一步的命令。
•continue (簡寫c ):繼續執行,到下乙個斷點處(或執行結束)
•next:(簡寫 n),單步跟蹤程式,當遇到函式呼叫時,也不進入此函式體;此命令同 step 的主要區別是,step 遇到使用者自定義的函式,將步進到函式中去執行,而 next 則直接呼叫函式,不會進入到函式體內。
•step (簡寫s):單步除錯如果有函式呼叫,則進入函式;與命令n不同,n是不進入呼叫的函式的
•until:當你厭倦了在乙個迴圈體內單步跟蹤時,這個命令可以執行程式直到退出迴圈體。
•until+行號: 執行至某行,不僅僅用來跳出迴圈
•finish: 執行程式,直到當前函式完成返回,並列印函式返回時的堆疊位址和返回值及引數值等資訊。
•call 函式(引數):呼叫程式中可見的函式,並傳遞「引數」,如:call gdb_test(55)
•quit:簡記為 q ,退出gdb
查詢執行資訊
•where/bt :當前執行的堆疊列表;
•bt backtrace 顯示當前呼叫堆疊
•up/down 改變堆疊顯示的深度
•set args 引數:指定執行時的引數
•show args:檢視設定好的引數
•info program: 來檢視程式的是否在執行,程序號,被暫停的原因
用來檢視程式執行所需的共享庫,常用來解決程式因缺少某個庫檔案而不能執行的一些問題。
ldd不是個可執行程式,而只是個shell指令碼;命令引數ldd顯示可執行模組的dependency的工作原理,其實質是通過ld-linux.so(elf動態庫的裝載器)來實現的。ld-linux.so模組會先於executable模組程式工作,並獲得控制權,因此當上述的那些環境變數被設定時,ld-linux.so選擇了顯示可執行模組的dependency。
lsof輸出各列資訊的意義如下:
列出某個程式程序所開啟的檔案資訊lsof -c mysql
通過某個程序號顯示該程序開啟的檔案lsof -p 11968
列出所有的網路連線lsof -i
列出所有tcp 網路連線資訊lsof -i tcp
列出誰在使用某個埠lsof -i :3306
列出某個使用者的所有活躍的網路埠lsof -a -u test -i
linux上程序有5種狀態:
1.執行(正在執行或在執行佇列中等待)
2.中斷(休眠中, 受阻, 在等待某個條件的形成或接受到訊號)
3.不可中斷(收到訊號不喚醒和不可執行, 程序必須等待直到有中斷發生)
4.僵死(程序已終止, 但程序描述符存在, 直到父程序呼叫wait4()系統呼叫後釋放)
5.停止(程序收到sigstop, sigstp, sigtin, sigtou訊號後停止執行執行)
ps工具標識程序的5種狀態碼:
d 不可中斷 uninterruptible sleep (usually io)
r 執行 runnable (on run queue)
s 中斷 sleeping
t 停止 traced or stopped
z 僵死 a defunct (」zombie」) process
命令引數
輸出列的含義
做減法 Linux工具快速教程 基礎篇
搜尋檔案或目錄 find name core xargs file 查詢目標資料夾中是否有obj檔案 find name o 遞迴當前目錄及子目錄刪除所有.o檔案 find name o exec rm locate會為檔案系統建立索引資料庫,如果有檔案更新,需要定期執行更新命令來更新索引庫 upd...
Linux工具快速教程
linux下有很多命令列工具供我們使用,每個工具總是提供了大量引數供我們選擇 實際工作中,我們用到的工具,最常用的總是那麼幾個引數組合 為此,我寫了這本書相對實用的書 這本書專注於linux工具的最常用用法,以便讀者能以最快時間掌握,並在工作中應用 全書分為三個部分 同時,這個教程也可當作linux...
發布 《Linux工具快速教程》
linux下有很多命令列工具供我們使用,每個工具總是提供了大量引數供我們選擇 實際工作中,我們用到的工具,最常用的總是那麼幾個引數組合 為此,我寫了這本書相對實用的書 這本書專注於linux工具的最常用用法,以便讀者能以最快時間掌握,並在工作中應用 全書分為三個部分 第一部分為基礎篇,介紹我們工作中...