我如何知道打开应用程序时执行了哪些文件?

nit*_*hch 12 12.04

我想知道打开某个应用程序时屏幕后面会发生什么。比如我打开firefox的时候,想知道读取了哪些文件,执行了哪些文件。有没有办法做到这一点。即使从终端打开 Firefox 也不显示任何信息。操作系统:Ubuntu 12.04

ntn*_*nja 21

使用strace

示例:列出 Firefox 在会话期间打开的所有文件:

strace -f firefox 2>&1 | grep 'open('

如果您打开 FireFox 的第二个实例,则会产生类似这样的结果:http : //pastebin.com/iRqxgiWN('-f' 选项只会让 strace 跟随进程分叉。)

示例 2:列出 FireFox 执行的所有进程:

strace -f firefox 2>&1 | grep -P 'exec[vlpe]*\('
Run Code Online (Sandbox Code Playgroud)

访问 YouTube 时的结果如下:

[pid 25020] execve("/usr/lib/firefox/plugin-container", ["/usr/lib/firefox/plugin-containe"..., "/usr/lib/adobe-flashplugin/libfl"..., "-greomni", "/usr/lib/firefox/omni.ja", "-appomni", "/usr/lib/firefox/browser/omni.ja", "-appdir", "/usr/lib/firefox/browser", "15198", "false", "plugin"], [/* 57 vars */]) = 0
[pid 25024] execve("/bin/sh", ["sh", "-c", "ps x | grep netscape"], [/* 57 vars */]) = 0
[pid 25025] execve("/bin/ps", ["ps", "x"], [/* 57 vars */] <unfinished ...>
[pid 25026] execve("/bin/grep", ["grep", "netscape"], [/* 57 vars */]) = 0
Run Code Online (Sandbox Code Playgroud)

您也可以使用许多其他系统调用来执行此操作...

通过匹配搜索中的参数,open()grep还可以找出文件以哪种模式打开:

只需添加| grep -P 'O_RDONLY|O_RDWR'(前导管道字符很重要!)以过滤读取访问或| grep -P 'O_WRONLY|O_RDWR'对命令的写入访问...

编辑

正如评论中提到的,您还可以strace -fe open firefox用来列出 FireFox 打开的所有文件。您还可以strace -fe trace=file firefox用于列出FireFox 执行的所有文件操作,这些操作将文件路径作为参数(open、stat、lstat、chmod、access 等)。

还有更多可用!查看strace(1)手册页。