linux程序调试命令strace
strace命令用法詳解:
strace常用來跟蹤進(jìn)程執(zhí)行時的系統(tǒng)調(diào)用和所接收的信號。 在Linux世界,進(jìn)程不能直接訪問硬件設(shè)備,當(dāng)進(jìn)程需要訪問硬件設(shè)備(比如讀取磁盤文件,接收網(wǎng)絡(luò)數(shù)據(jù)等等)時,必須由用戶態(tài)模式切換至內(nèi)核態(tài)模式,通過系統(tǒng)調(diào)用訪問硬件設(shè)備。strace可以跟蹤到一個進(jìn)程產(chǎn)生的系統(tǒng)調(diào)用,包括參數(shù),返回值,執(zhí)行消耗的時間。
strace常用參數(shù):
-p 跟蹤指定的進(jìn)程 -f 跟蹤由fork子進(jìn)程系統(tǒng)調(diào)用 -F 嘗試跟蹤vfork子進(jìn)程系統(tǒng)調(diào)吸入,與-f同時出現(xiàn)時, vfork不被跟蹤 -o filename 默認(rèn)strace將結(jié)果輸出到stdout。通過-o可以將輸出寫入到filename文件中 -ff 常與-o選項一起使用,不同進(jìn)程(子進(jìn)程)產(chǎn)生的系統(tǒng)調(diào)用輸出到filename.PID文件 -r 打印每一個系統(tǒng)調(diào)用的相對時間 -t 在輸出中的每一行前加上時間信息。 -tt 時間確定到微秒級。還可以使用-ttt打印相對時間 -v 輸出所有系統(tǒng)調(diào)用。默認(rèn)情況下,一些頻繁調(diào)用的系統(tǒng)調(diào)用不會輸出 -s 指定每一行輸出字符串的長度,默認(rèn)是32。文件名一直全部輸出 -c 統(tǒng)計每種系統(tǒng)調(diào)用所執(zhí)行的時間,調(diào)用次數(shù),出錯次數(shù)。 -e expr 輸出過濾器,通過表達(dá)式,可以過濾出掉你不想要輸出命令實例:
[root@tomcat02 ~]# strace cat /dev/null execve("/bin/cat", ["cat", "/dev/null"], [/* 26 vars */]) = 0 brk(0) = 0x24ef000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443faf000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=70314, ...}) = 0 mmap(NULL, 70314, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b8443fb0000 close(3) = 0 open("/lib64/libc.so.6", O_RDONLY) = 3 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\360\355A\2428\0\0\0"..., 832) = 832 fstat(3, {st_mode=S_IFREG|0755, st_size=1979000, ...}) = 0 mmap(0x38a2400000, 3803304, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x38a2400000 mprotect(0x38a2597000, 2097152, PROT_NONE) = 0 mmap(0x38a2797000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x197000) = 0x38a2797000 mmap(0x38a279c000, 18600, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x38a279c000 close(3) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443fc2000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b8443fc3000 arch_prctl(ARCH_SET_FS, 0x2b8443fc2b20) = 0 mprotect(0x38a2797000, 16384, PROT_READ) = 0 mprotect(0x38a1e1f000, 4096, PROT_READ) = 0 munmap(0x2b8443fb0000, 70314) = 0 brk(0) = 0x24ef000 brk(0x2510000) = 0x2510000 open("/usr/lib/locale/locale-archive", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=99158704, ...}) = 0 mmap(NULL, 99158704, PROT_READ, MAP_PRIVATE, 3, 0) = 0x2b8443fc4000 close(3) = 0 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0 open("/dev/null", O_RDONLY) = 3 fstat(3, {st_mode=S_IFCHR|0666, st_rdev=makedev(1, 3), ...}) = 0 read(3, "", 32768) = 0 close(3) = 0 close(1) = 0 close(2) = 0 exit_group(0) = ?每一行都是一條系統(tǒng)調(diào)用,等號左邊是系統(tǒng)調(diào)用的函數(shù)名及其參數(shù),右邊是該調(diào)用的返回值。
strace 顯示這些調(diào)用的參數(shù)并返回符號形式的值。strace 從內(nèi)核接收信息,而且不需要以任何特殊的方式來構(gòu)建內(nèi)核。
通用的完整用法:
strace -o output.txt -T -tt -e trace=all -p 28979上面的含義是 跟蹤28979進(jìn)程的所有系統(tǒng)調(diào)用(-e trace=all),并統(tǒng)計系統(tǒng)調(diào)用的花費(fèi)時間,以及開始時間(并以可視化的時分秒格式顯示),最后將記錄結(jié)果存在output.txt文件里面。
2.在umount掛載目錄時,直接卡住了,最后用 strace df -Th分析后結(jié)果掛載出問題了
strace df -Th3.用strace跟蹤 whoami的輸出:
strace -o whoami-strace.txt whoami
參考文檔:http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html
轉(zhuǎn)載于:https://www.cnblogs.com/saneri/p/5466519.html
總結(jié)
以上是生活随笔為你收集整理的linux程序调试命令strace的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux嵌入式入门
- 下一篇: 简单实现DButil工具类