2010-09-08 7 views
7

Mam aplikacji (źródło dla których nie mam), które mogą być wywoływane z linii poleceń jak toJak dowiedzieć się, do czego pisze zamknięta aplikacja źródłowa?

$ ./notmyapp 

chcę znać wszystkie lokalizacje w którym składany jest na piśmie do. Wydaje niektóre pliki z katalogu, z którego jest wywoływany, ale muszę się upewnić, że są to jedyne pliki, które są tworzone.

Muszę więc odizolować aplikację, aby dowiedzieć się, które pliki zostały utworzone/edytowane podczas jej pracy.

Jak mogę to zrobić?

Jakiś sposób korzystania z Perla lub C lub C++? Czy którakolwiek ze standardowych bibliotek w tych językach ma na to jakiś sposób?

Odpowiedz

24

strace, ktrace/kdump, truss, dtruss, czy cokolwiek innego programu Twoja platforma zapewnia śledzenie wywołań systemowych jest chyba to, czego szukasz.

Można oczekiwać dużej liczby wyników z dowolnego z nich. Aby dowiedzieć się, do jakich plików aplikacja odczytuje i pisze, możesz ograniczyć wyjście do kilku systemów. strace -eopen ./notmyapp, na przykład.

Aplikacja może również rozwidlić procesy podrzędne, aby wykonać niektóre z jej prac. W przypadku większości znaczników wywołań systemowych musisz również dokładnie opisać śledzenie procesów potomnych. Z strace, to byłby strace -f ./notmyapp.

+0

+1 dla '-eopen' i biorąc pod uwagę platformy inne niż linux. – Johnsyweb

+0

Problem polega na tym, że 'notmyapp' powinien generować podpowiedź i czekać na moje dane wejściowe zanim coś zrobi (z wyjątkiem tego, co robi w tle). Używam 'strace -f./Notmyapp' i nie otrzymuję w ogóle polecenia, ale wiele różnych wątków i niektóre wywołania systemowe. – Lazer

+7

Prawdopodobnie nie chcesz, abyś uruchomił swoją aplikację pod pasemką. Zamiast tego, po prostu uruchom aplikację w normalny sposób i dołącz do niej strace później, używając 'strace -p $ pid' i identyfikatora procesu twojej aplikacji, który odkryłeś wcześniej używając na przykład' ps'. – rafl

2

można użyć strace.

5

W systemach UNIX, można użyć strace wydrukować ślad wszystkich wywołań systemowych wykonanych i sygnałów odbieranych przez proces:

$ strace ./notmyapp 

grep mogą być wykorzystane do ograniczenia produkcji do podzbioru wywołań systemowych :

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

W wynikach śledzenia powinienem szukać tylko instrukcji 'open()'? – Lazer

+0

@Lazer: Wierzę, że szukasz 'open()' (w trybie pisania) i 'write()' wywołania systemowe –

1

Możesz spróbować uruchomić go jako użytkownik, który nie ma uprawnień do pisania w dowolnym miejscu na dysku. Następnie pojawia się komunikat o błędzie podczas próby utworzenia/zapisania pierwszego pliku. Zaloguj się do tego katalogu/pliku i nadaj mu prawa do zapisu, a następnie powtarzaj, dopóki nie będzie więcej komunikatów o błędach.

2

Mówisz w odpowiedzi na odpowiedź Rafla, że ​​notmyapp ma generować monit i czekać na [...] dane wejściowe, zanim coś zrobi.

Połóż wejść wcześniej do pliku tekstowy (powiedzmy, responses.txt), jedno wejście na linię. Następnie użyj strace, jak sugeruje aby śledzić połączenia open() lub write() orurowania w treści responses.txt:

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

Jeśli spodziewasz sporo dostępu do pliku, a następnie może zostać rurze wyjście do swojego ulubionego pager lub edytor:

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

strace to potężne narzędzie. Aby uzyskać więcej informacji, skonsultuj się z man strace.

Powiązane problemy