Linux

無法使用 strace 擷取文件創建

  • August 27, 2016

當我在建構目錄中執行以下make命令時,它幾乎是空的(有問題的文件肯定不存在)

strace -f -e trace=execve,vfork,open,creat -s 1024 make <target>

完成後,文件就完全存在了。所以它必須是由make它的子程序之一(或它們的子程序的子程序等)創建的。

但是,當我 grepstrace文件名或文件名的日誌時,creat我找不到負責創建此文件的系統呼叫。

我錯過了什麼?我應該監控其他系統呼叫嗎?


編輯: 事實證明,錯誤出在我的 strace comamnd 和我的 grepping 中。所有的答案都很有幫助,謝謝大家,謝謝你們的時間。

實際上,我未能傳達該文件位於子目錄中,並且我正在使用文件名和子目錄名進行 grepping。但是由於 strace 不提供有關目前工作目錄的資訊,因此這種方法效果不佳(我最終進行了 stracechdirrename呼叫以獲得所需的效果)。

所以 PaulHaldane 的第一個建議是正確的,而且中肯。以及 larsks 的回答,他實際上已經猜到了文件是如何創建的。

不帶該選項執行 strace -e,看看是否可以改善您的結果。

有多種方法可以創建文件。而不是open-ing 它,很可能是生成該文件的任何工具首先打開一個臨時文件,寫入數據,然後在完成時重命名該文件。

使用您目前的限制 ( execve,vfork,open,creat),您不會看到這種行為。

例如,給定這個簡單的 python 腳本:

import os
import tempfile

fd = tempfile.NamedTemporaryFile(dir='.', delete=False)
fd.write('this is a test\n')
fd.close()

os.rename(fd.name, 'output')

使用您的參數執行strace,然後output在結果中查找不會產生任何結果:

$ strace -e trace=execve,vfork,open,creat -o trace -f -s 80 python tmptest.py
$ grep output trace
$

但是如果我刪除-e過濾器:

$ strace  -o trace -f -s 80 python tmptest.py
$ grep output trace
4523  rename("/home/lars/tmp/tmpZDwvPK", "output") = 0

在對您的問題的評論中,Sato Katsura 提供了一個範例,在該範例中您不會在輸出中看到目標文件名,但我認為只要您從乾淨的建構環境開始strace執行,您就不太可能遇到這種情況。make

引用自:https://unix.stackexchange.com/questions/306057