2010-09-08 26 views
7

我有一個應用程序(我沒有,它的源),它可以從命令行調用這樣如何找出封閉的源應用程序在哪裏寫入?

$ ./notmyapp 

我想知道所有在應用程序寫入的位置。它輸出它正在被調用的目錄中的一些文件,但我需要確保這些文件是唯一被創建的文件。

因此,我需要隔離應用程序以找出它在運行時創建/編輯的所有文件。

我該怎麼做?

使用Perl或C或C++的某些方法?這些語言中的任何標準庫有沒有辦法做到這一點?

回答

24

stracektrace/kdumptrussdtruss,或任何其他程序的平臺提供了跟蹤系統調用,也可能是你在找什麼。

預計會有大量的輸出。要確定應用程序正在讀取和寫入的文件,可能需要將輸出限制爲少數幾個系統調用。例如,strace -eopen ./notmyapp

該應用程序可能還會分離子進程以完成其某些工作。對於大多數系統調用追蹤器,您還必須具體描述這些子進程。隨着strace,這將是strace -f ./notmyapp

+0

+1,並考慮使用非Linux平臺。 – Johnsyweb 2010-09-08 09:29:44

+0

問題在於'notmyapp'應該會產生一個提示並在做某事之前等待我的輸入(除了它在後臺執行的操作)。我正在使用'strace -f。/ notmyapp',我根本沒有得到任何提示,但有很多不同的線程和一些系統調用。 – Lazer 2010-09-08 11:08:50

+7

你可能不想喲,然後在strace下啓動你的應用程序。相反,只需正常啓動你的應用程序,然後使用'strace -p $ pid'和你之前發現的應用程序的進程id(例如'ps')將strace連接到它。 – rafl 2010-09-08 11:35:59

2

你可以使用strace。

5

在Unix系統中,你可以使用strace打印出一個進程收到的所有的系統調用和信號的跟蹤:

$ strace ./notmyapp 

grep可用於限制輸出到子集的系統調用:

$ strace ./notmyapp 2>&1 | egrep '(open|write)' 
+0

在跟蹤輸出中,我應該只查找'open()'語句嗎? – Lazer 2010-09-08 09:19:27

+0

@Lazer:我相信你正在爲'-eopen'尋找'open()'(寫模式)和'write()'系統調用 – 2010-09-08 09:30:06

1

您可以嘗試將它作爲無權寫入任何驅動器上的任何位置的用戶來運行。然後,當您嘗試創建/寫入第一個文件時,您會收到錯誤消息。記錄該目錄/文件並給它寫入權限,然後重複,直到沒有更多的錯誤消息。

2

你說迴應rafl的回答,notmyapp應該產生提示並在做某事之前等待輸入。

將您的輸入事先放入一個純文本文件(例如,responses.txt),每行一個輸入。然後用strace,所建議的情況進行跟蹤open()來電或write()管道在responses.txt內容:

$ strace -eopen -ewrite ./notmyapp < responses.txt 

如果你期待了很多的文件訪問,那麼你可能希望通過管道輸出到您喜歡的分頁或編輯:

$ strace -eopen -ewrite ./notmyapp < responses.txt | vim -R - 

strace是一個強大的工具。欲瞭解更多信息,請諮詢man strace

相關問題