1. 15、 [單選題] 很多發行版unix/linux系統中,提供了一個用於跟蹤命令或程序執
strace命令---跟蹤程序執行
在理想世界裡,每當一個程序不能正常執行一個功能時,它就會給出一個有用的錯誤提示,告訴你在足夠的改正錯誤的線索。但遺憾的是,我們不是生活在理想世界 里,起碼不總是生活在理想世界裡。有時候一個程序出現了問題,你無法找到原因。
這就是調試程序出現的原因。strace是一個必不可少的 調試工具,strace用來監視系統調用。你不僅可以調試一個新開始的程序,也可以調試一個已經在運行的程序(把strace綁定到一個已有的PID上 面)
建議看看這本書《Linux就該這么學》
2. 如何在linux系統中查找php.ini的位置
這個時候,使用如下命令
strace -o php.log -s 65535 php -i
然後在輸出結果文件php.log中搜索ini
可能的輸出結果是:
open("/usr/bin/php-cli.ini", O_RDONLY)=-1 ENOENT (No such file or directory)
open("/etc/php-cli.ini", O_RDONLY)=-1 ENOENT (No such file or directory)
open("/usr/bin/php.ini", O_RDONLY)=-1 ENOENT (No such file or directory)
open("/etc/php.ini", O_RDONLY)
如上,最終定位到 /etc/php.ini
strace這個命令在跟蹤程序執行的時候特別有用,這個命令值得深入研究。
3. linux的strace怎麼用
1、直接strace運行命令:strace xxx 2、跟蹤已運行的進程:strace -p pid 3、輸出到文件:strace -o filename -p pid
4. 如何使用strace+pstack利器分析程序性能
有時我們需要對程序進行優化、減少程序響應時間。除了一段段地對代碼進行時間復雜度分析,我們還有更便捷的方法嗎?
若能直接找到影響程序運行時間的函數調用,再有針對地對相關函數進行代碼分析和優化,那相比漫無目的地看代碼,效率就高多了。
將strace和pstack工具結合起來使用,就可以達到以上目的。strace跟蹤程序使用的底層系統調用,可輸出系統調用被執行的時間點以及各個調用耗時;pstack工具對指定PID的進程輸出函數調用棧。
下面我們通過一個簡單的消息收發程序,說明使用strace、pstack進行程序分析的具體方法。
程序說明
該程序是一個簡單的socket程序,由server/client組成。server端監聽某埠,等待client的連接,client連接server後定時向server發送消息,server每接收一條消息後向client發送響應消息。程序server與client交互如下圖示:
在程序運行起來之後,發現server接收到client的submit消息之後,需要較長時間才發出resp響應。通過tcpmp抓包發現,time2與time1的時間間隔在1s左右:
由上初步分析可知,消息響應慢是server端程序問題。下面我們來看如何使用strace和pstack分析server端程序響應慢的原因。
strace查看系統調用
首先我們拉起server/client程序,並使用strace對server進程進行跟蹤:
# ps -elf | grep server | grep -v grep
0 S root 16739 22642 0 76 0 - 634 1024 14:26 pts/2 00:00:00 ./server
# strace -o server.strace -Ttt -p 16739
Process 16739 attached - interrupt to quit
稍等一段時間之後,我們將strace停掉, server.strace文件中有以下輸出:
14:46:39.741366 select(8, [3 4], NULL, NULL, {1, 0}) = 1 (in [4], left {0, 1648}) <0.998415>
14:46:40.739965 recvfrom(4, "hello", 6, 0, NULL, NULL) = 5 <0.000068>
14:46:40.740241 write(1, "hello\n", 6) = 6 <0.000066>
14:46:40.740414 rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0 <0.000046>
14:46:40.740565 rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0 <0.000048>
14:46:40.740715 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 <0.000046>
14:46:40.740853 nanosleep({1, 0}, {1, 0}) = 0 <1.000276>
14:46:41.741284 sendto(4, "hello\0", 6, 0, NULL, 0) = 6 <0.000111>
可以看到server接收數據之後(對應recvfrom調用),經過1s左右時間將消息發出(對應sendto調用),從響應時間看,與抓包的結果吻合。又可以看出nanosleep系統調用耗費了1s時間。
因而可以斷定響應延時由nanosleep對應的函數調用造成。
那具體是哪一個函數調用呢?在strace輸出結果中並不能找到答案,因其輸出顯示都是系統調用,要顯示程序中函數調用棧信息,就輪到pstack上場了。
pstack查看函數堆棧
pstack是一個腳本工具,其核心實現就是使用了gdb以及thread apply all bt命令,下面我們使用pstack查看server進程函數堆棧:
# sh pstack.sh 16739
#0 0x00002ba1f8152650 in __nanosleep_nocancel () from /lib64/libc.so.6
#1 0x00002ba1f8152489 in sleep () from /lib64/libc.so.6
#2 0x00000000004007bb in ha_ha ()
#3 0x0000000000400a53 in main ()
從以上信息可以看出,函數調用關系為:main->ha_ha->sleep,因而我們可以找到ha_ha函數進行分析和優化修改。
小結
本文通過一個server/client程序事例,說明了使用strace和pstack分析響應延時的方法。
由最初server端響應慢現象,到使用strace跟蹤出具體耗時的系統調用,再到使用pstack查到程序中具體的耗時函數,一步步找到了影響程序運行時間的程序代碼。
更多地了解底層,從操作系統層面著手,更有助於程序性能分析與優化。
5. trace.html怎麼觀察某個應用
1、直接strace運行命令:strace xxx
2、跟蹤已運行的進程:strace -p pid
3、輸出到文件:strace -o filename -p pid
6. 怎樣查看一個命令,用了哪些系統調用
實際上如果你是想知道有沒有什麼命令能查看一個系統有多少個系統調用的話......據我所知估計沒有..............
每個系統的系統調用大致都差不多.具體有多少個可能有差別.........在內核里系統調用是按編號來添加的...........具體怎麼添加可以看{@深入理解linux內核}中關於系統調用的相關部分.........具體要知道一個系統有多少調用需要看每個系統類型的內核文件.........具體哪個文件@里說的很清楚......
實際上linux系統調用處理過程還是比較簡單的...........添加一個系統調用對內核來說實際就是添加了一個內核函數.然後這個函數映射到了用戶層就是系統調用.用戶調用這個系統調用的時候.會由軟中斷機制觸發內核.使用戶陷入內核態執行相關的內核函數............執行結果再一層層返回給用戶.............大概就是這個過程.
7. 我的LINUX伺服器沒有strace命令,CENTOS 5.6,怎麼安裝它呢
可以使用yum -y install strace來安裝,centos系統安裝使用使用yum命令。
yum命令說明:
yum命令是在Fedora和RedHat、centos以及SUSE中基於rpm的軟體包管理器,它可以使系統管理人員交互和自動化地更細與管理RPM軟體包,能夠從指定的伺服器自動下載RPM包並且安裝,可以自動處理依賴性關系,並且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載、安裝。
yum提供了查找、安裝、刪除某一個、一組甚至全部軟體包的命令,而且命令簡潔而又好記。
語法
yum(選項)(參數)
選項
-h:顯示幫助信息;
-y:對所有的提問都回答「yes」;
-c:指定配置文件;
-q:安靜模式;
-v:詳細模式;
-d:設置調試等級(0-10);
-e:設置錯誤等級(0-10);
-R:設置yum處理一個命令的最大等待時間;
-C:完全從緩存中運行,而不去下載或者更新任何頭文件。
參數
install:安裝rpm軟體包;
update:更新rpm軟體包;
check-update:檢查是否有可用的更新rpm軟體包;
remove:刪除指定的rpm軟體包;
list:顯示軟體包的信息;
search:檢查軟體包的信息;
info:顯示指定的rpm軟體包的描述信息和概要信息;
clean:清理yum過期的緩存;
shell:進入yum的shell提示符;
resolvedep:顯示rpm軟體包的依賴關系;
localinstall:安裝本地的rpm軟體包;
localupdate:顯示本地rpm軟體包進行更新;
deplist:顯示rpm軟體包的所有依賴關系。
8. linux下調試程序用什麼工具
Linux調試程序大多數都是喜歡用gdb,gdb是一個命令行界面的程序調試工具,任何調試操作都是輸入命令來實現的。從Windows過來的程序員可能不習慣用gdb這個調試器,可以去試試一些圖形界面的的調試器,比如Kgdb、Affinic GUI Debugger,這兩款調試器雖然是圖形界面的調試器,但是它其實是調用gdb來完成它的調試功能的,也就是說它們其實是gdb的一個圖形界面的外殼,所以要先安裝好gdb再安裝它們,不習慣gdb的命令界面的話,可以試試這兩款軟體。
9. 使用strace來跟蹤mysql查詢,看看到底是卡在什麼地方.先找到mysql進程的pid
有兩種方法,一種方法使用mysql的check table和repair table 的sql語句,另一種方法是使用MySQL提供的多個myisamchk, isamchk數據檢測恢復工具。前者使用起來比較簡便。推薦使用。
1. check table 和 repair table
登陸mysql 終端:
mysql -uxxxxx -p dbname
check table tabTest;
如果出現的結果說Status是OK,則不用修復,如果有Error,可以用:
repair table tabTest;
進行修復,修復之後可以在用check table命令來進行檢查。在新版本的phpMyAdmin裡面也可以使用check/repair的功能。
2. myisamchk, isamchk
其中myisamchk適用於MYISAM類型的數據表,而isamchk適用於ISAM類型的數據表。這兩條命令的主要參數相同,一般新的系統都使用MYISAM作為預設的數據表類型,這里以myisamchk為例子進行說明。當發現某個數據表出現問題時可以使用:
myisamchk tablename.MYI
進行檢測,如果需要修復的話,可以使用:
myisamchk -of tablename.MYI
關於myisamchk的詳細參數說明,可以參見它的使用幫助。需要注意的時在進行修改時必須確保MySQL伺服器沒有訪問這個數據表,保險的情況下是最好在進行檢測時把MySQL伺服器Shutdown掉。
-----------------------------
另外可以把下面的命令放在你的rc.local裡面啟動MySQL伺服器前:
[ -x /tmp/mysql.sock ] && /pathtochk/myisamchk -of /DATA_DIR/*/*.MYI
其中的/tmp/mysql.sock是MySQL監聽的Sock文件位置,對於使用RPM安裝的用戶應該是/var/lib/mysql/mysql.sock,對於使用源碼安裝則是/tmp/mysql.sock可以根據自己的實際情況進行變更,而pathtochk則是myisamchk所在的位置,DATA_DIR是你的MySQL資料庫存放的位置。
需要注意的時,如果你打算把這條命令放在你的rc.local裡面,必須確認在執行這條指令時MySQL伺服器必須沒有啟動!檢測修復所有資料庫(表)
10. linux操作系統中常見的進程管理命令有哪些
ps:查看進程
pstree:顯示進程狀態樹
pgrep:查找匹配條件的進程
kill:終止進程
killall:通過進程名終止進程
pkill:通過進程名終止進程
top:實時顯示系統中各個進程的資源佔用狀況
nice:調整程序運行時的優先順序
renice:調整運行中進程的優先順序
nohup:用戶退出系統進程繼續工作
strace:跟蹤進程的系統調用
ltrace:跟蹤進程調用庫函數
runlevel:輸出當前運行級別
init:初始化Linux進程
service:管理系統服務