無法使用 strace 擷取文件創建
當我在建構目錄中執行以下
make
命令時,它幾乎是空的(有問題的文件肯定不存在)
strace -f -e trace=execve,vfork,open,creat -s 1024 make <target>
完成後,文件就完全存在了。所以它必須是由
make
它的子程序之一(或它們的子程序的子程序等)創建的。但是,當我 grep
strace
文件名或文件名的日誌時,creat
我找不到負責創建此文件的系統呼叫。我錯過了什麼?我應該監控其他系統呼叫嗎?
編輯: 事實證明,錯誤出在我的 strace comamnd 和我的 grepping 中。所有的答案都很有幫助,謝謝大家,謝謝你們的時間。
實際上,我未能傳達該文件位於子目錄中,並且我正在使用文件名和子目錄名進行 grepping。但是由於 strace 不提供有關目前工作目錄的資訊,因此這種方法效果不佳(我最終進行了 strace
chdir
並rename
呼叫以獲得所需的效果)。所以 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