做減法 Linux工具快速教程 高階篇

2021-07-15 06:26:23 字數 4942 閱讀 4782

一般源**提供的程式安裝需要通過配置、編譯、安裝三個步驟;

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標記非標準標頭檔案存放路徑

ldflags -l標記非標準庫存放路徑

如果cppflags和ldflags已在使用者環境變數中設定並且匯出(使用export關鍵字),就不用再顯示指定;

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 # 啟動gdb

break 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工具的最常用用法,以便讀者能以最快時間掌握,並在工作中應用 全書分為三個部分 第一部分為基礎篇,介紹我們工作中...