strace 的原理是通過攔截目標(biāo)進(jìn)程的系統(tǒng)調(diào)用來進(jìn)行跟蹤
strace 是一種在 Linux 系統(tǒng)下跟蹤系統(tǒng)調(diào)用的工具。它能夠捕捉應(yīng)用程序的系統(tǒng)調(diào)用以及與之相關(guān)的信號(hào)和錯(cuò)誤,從而幫助我們分析程序執(zhí)行時(shí)的問題。
strace 的原理是通過攔截目標(biāo)進(jìn)程的系統(tǒng)調(diào)用來進(jìn)行跟蹤。在 Linux 中,系統(tǒng)調(diào)用是應(yīng)用程序與操作系統(tǒng)內(nèi)核之間的接口。當(dāng)一個(gè)應(yīng)用程序需要訪問操作系統(tǒng)內(nèi)核提供的功能時(shí),它會(huì)通過系統(tǒng)調(diào)用來向內(nèi)核發(fā)出請(qǐng)求。strace 通過在目標(biāo)進(jìn)程的系統(tǒng)調(diào)用前后插入自己的代碼來捕捉系統(tǒng)調(diào)用的執(zhí)行情況。
以下是一個(gè)使用 strace 跟蹤 ls 命令執(zhí)行情況的例子:
$ strace ls
execve("/usr/bin/ls", ["ls"], 0x7ffc5f38bb60 /* 51 vars */) = 0
brk(NULL) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? = 0x55e14d36e000
arch_prctl(0x38 /* ARCH_??? */, 0x7ffdc3109680) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK) ? ? ?= -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=294584, ...}) = 0
mmap(NULL, 294584, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f5e2d266000
close(3) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= 0
openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
...
上面的輸出結(jié)果顯示了 ls 命令的執(zhí)行過程中涉及的系統(tǒng)調(diào)用和相應(yīng)的參數(shù)。例如,第一行顯示了 execve 系統(tǒng)調(diào)用的執(zhí)行情況,它是在啟動(dòng) ls 命令時(shí)由 shell 調(diào)用的。第二行顯示了 brk 系統(tǒng)調(diào)用的執(zhí)行情況,它是用來管理進(jìn)程內(nèi)存空間的。接下來的一些行顯示了對(duì)一些共享庫的加載和使用過程。
通過 strace,我們可以更深入地了解程序的執(zhí)行情況,查找并定位可能的問題。