當我們熟悉一定的基礎命令時,我們往往會接觸到一些高階的命令操作,或者說是陌生的命令操作。
2.1. 程序除錯
gdb 程式互動除錯
gdb是乙個由gnu開源組織發布的、unix/linux作業系統下的、基於命令列的、功能強大的程式除錯工具。
對於一名linux下工作的c++程式設計師,gdb是必不可少的工具;
啟動gdb$g++ -g hello.cpp -o hello
除錯可執行檔案:#gdb
除錯服務程式:
$gdb
$gdb hello 11127
以下從乙個完整的除錯過程簡單說明最基本的幾個命令;
$gdb programmer # 啟動gdb
>break main # 設定斷點
>run # 執行除錯程式
>next # 單步除錯
>print var1 # 在除錯過程中,我們需要檢視當前某個變數值的時候,使用print 命令列印該值
>list # 顯示當前除錯處的源**
>info b # 顯示當前斷點設定情況
同時,你需要更高效的除錯:常用的除錯命令都會有單字元的縮寫,使用縮寫更方便;同時,直接敲回車表示重複執行上一步命令;這在單步除錯時非常有用;
pstack 跟蹤棧空間#pstrack
strace常用來跟蹤程序執行時的系統呼叫和所接收的訊號。使用者態模式切換至核心態模式
跟蹤28979程序的所有系統呼叫,並統計系統呼叫的花費時間,以及開始時間(以視覺化的時分秒格式顯示),最後將記錄結果存在output.txt檔案裡面
#strace -o output.txt -t -tt -e trace=all -p 28979
檢視程序正在做什麼(實時輸出程序執行系統呼叫的情況)#strace -p
2.2. 目標檔案分析
nm--用來列出目標檔案的符號清單。
$nm myprogrammer
正文段--可執行**的段;,資料段--不可執行的資訊或資料; bss 段--以符號資料開頭的塊
nm命令列出的每個符號,它們的值使用十六進製制來表示(預設行為),並且在該符號前面加上了乙個表示符號型別的編碼字元。常見的各種編碼包括:
a 表示絕對 (absolute),這意味著不能將該值更改為其他的連線;
b 表示 bss 段中的符號;
c 表示引用未初始化的資料的一般符號。
objdump顯示二進位制檔案的資訊,就是以一種可閱讀的格式讓你更多地了解二進位制檔案可能帶有的附加資訊
#objdump -d myprogrammer
常用引數說明
-f 顯示檔案頭資訊
-d 反彙編所有section (-d反彙編特定section)
-h 顯示目標檔案各個section的頭部摘要資訊
-x 顯示所有可用的頭資訊,包括符號表、重定位入口。-x 等價於 -a -f -h -r -t 同時指定。
-i 顯示對於 -b 或者 -m 選項可用的架構和目標格式列表。
-r 顯示檔案的重定位入口。如果和-d或者-d一起使用,重定位部分以反彙編後的格式顯示出來。
-r 顯示檔案的動態重定位入口,僅僅對於動態目標檔案有意義,比如某些共享庫。
-s 盡可能反彙編出源**,尤其當編譯的時候指定了-g這種除錯引數時,效果比較明顯。隱含了-d引數。
-t 顯示檔案的符號表入口。類似於nm -s提供的資訊
檢視本機目標結構(使用大端還是小端儲存):$objdump -i
反匯程式設計序:$objdump -d main.o
顯示符號表入口:$objdump -t main.o
readelf
$readelf -all a.out
$readelf --debug-dump a.out | more
size 檢視程式記憶體占用
#top
#whereis fcitx
#size /usr/bin/fcitx
file 檔案型別查詢
$file core.22355
strings 查詢資料中的文字資訊
乙個檔案中包含二進位制資料和文字資料,如果只需要檢視其文字資訊,使用這個命令就很方便;過濾掉非字元資料,將文字資訊輸出:$strings
顯示所有正在使用著指定的file, file system 或者 sockets的程序資訊;
fuser 顯示檔案使用者
顯示所有正在使用著指定的file, file system 或者 sockets的程序資訊;
$fuser -m -u redis-server
fuser通常被用在診斷系統的」resource busy」問題。如果你希望kill所有正在使用某一指定的file, file system or sockets的程序的時候,你可以使用-k選項:
$fuser –k /path/to/your/filename
xxd 十六進製制顯示資料
#xxd /root/desktop/1
od通常使用od命令檢視特殊格式的檔案內容。通過指定該命令的不同選項可以以十進位制、八進位制、十六進製制和ascii碼來顯示檔案。
引數說明:
-a 指定位址基數,包括:
d 十進位制
o 八進位制(系統預設值)
x 十六進製制
n 不列印位移值
-t 指定資料的顯示格式,主要的引數有:
c ascii字元或反斜槓序列
d 有符號十進位制數
f 浮點數
o 八進位制(系統預設值為02)
u 無符號十進位制數
x 十六進製制數
$od -ax /root/desktop/1
從系統層面和程式層面進行效能優化。
3.1. 分析系統瓶頸 ---top 命令
系統響應變慢:io瓶頸、cpu瓶頸、記憶體瓶頸、程式導致的系統問題
使用top工具能夠比較全面的檢視我們關注的點:#top
進入互動模式後:
輸入m,程序列表按記憶體使用大小降序排序,便於我們觀察最大記憶體使用者使用有問題(檢測記憶體洩漏問題);
輸入p,程序列表按cpu使用大小降序排序,便於我們觀察最耗cpu資源的使用者是否有問題;
top第三行顯示當前系統的,其中有兩個值很關鍵:
%id:空閒cpu時間百分比,如果這個值過低,表明系統cpu存在瓶頸;
%wa:等待i/o的cpu時間百分比,如果這個值過高,表明io存在瓶頸;
3.2. 分析記憶體瓶頸 --free命令
一 使用free 命令
#free -mh
二 使用vmstat 命令
vmstat是virtual meomory 可實時動態監視作業系統的虛擬記憶體、程序、cpu活動。
vmstat [-v] [-n] [delay [count]]
-v表示列印出版本資訊;
-n表示在週期性迴圈輸出時,輸出的頭部資訊僅顯示一次;
delay是兩次輸出之間的延遲時間;
count是指按照這個時間間隔統計的次數。
/root$vmstat 5 5
procs -----------------memory-----------------------swap-- -----------io--------- -system-- ---------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 5524 172304 178400 969340 0 0 8 29 50 146 1 0 98 1 0
0 0 5524 172252 178400 969348 0 0 0 0 378 1089 19 3 78 0 0
3 0 5524 170888 178412 969352 0 0 0 31 636 1460 38 6 56 0 0
procs memory swap system:
r:執行佇列中程序數量 swpd:使用虛擬記憶體大小 si:每秒從交換區寫到記憶體的大小 in: 每秒中斷數,包括時鐘中斷
b:等待io的程序數量 free:可用記憶體大小 so:每秒寫入交換區的記憶體大小cs: 每秒上下文切換數
buff:用作緩衝的記憶體大小 io:現在linux版本塊的大小為1024bcpu(以百分比表示)
cache:用作快取的記憶體大小 bi:每秒讀取的塊數us: 使用者程序執行時間
bo:每秒寫入的塊數 sy: 系統程序執行時間
linux高階命令
二 許可權的修改組管理 三 內容檢視,壓縮,解壓,檔案大小的檢視 四 vi 或者vim編輯器 五 管道 查詢 grep find locate wa 六 輸出及顯示 七 主機名hostname和hosts檔案的操作 八 軟體的安裝和解除安裝 九 jdk的安裝和配置 十 history的操作和幫助文件...
Linux命令高階
nl命令在linux系統中用來計算檔案中行號。nl 可以將輸出的檔案內容自動的加上行號!其預設的結果與 cat n 有點不太一樣,nl 可以將行號做比較多的顯示設計,包括位數與是否自動補齊 0 等等的功能 ocate 讓使用者可以很快速的搜尋檔案系統內是否有指定的檔案。其方法是先建立乙個包括系統內所...
Linux高階命令
作用 操作伺服器的主機名 讀取和設定 用法1 hostname 表示輸出完整的主機名 用法2 hostname f 表示輸出當前主機名的fqdn 全限定網域名稱 作用 檢視乙個使用者的一些基本資訊 包含使用者id,使用者組id,附加組id 該命令如果不指定則預設當前使用者 用法1 id 預設使用者資...