使用 strace 调试文件访问

使用 strace 调试文件访问

我正在尝试找出正在运行的程序尝试(但失败了)打开的文件的完整路径。我被告知可以strace做到这一点,但我显然没有正确使用它。正在运行的程序是一项服务,因此我看不出有什么简单的方法可以直接运行它strace。我见过的例子让它看起来像

$ sudo strace -p <process id> -e open,access

是附加到正在运行的进程的正确咒语,但当我运行它时,我看不到任何输出,即使相关程序正在记录其打开文件的失败尝试。我甚至没有看到任何输出

$ sudo strace -p 24249
Process 24249 attached - interrupt to quit
futex(0x7f650fe159d0, FUTEX_WAIT, 24250, NULL

就像是因为某种原因 futex 被切断了一样?或者这是这种情况的正常输出?

无论如何,我做错了什么?

答案1

您是否可以在服务本身上运行 strace,即在手动启动服务时打开它。

strace -ffttTo /tmp/strace.out service <foo> start

并将生成的文件粘贴到 pastebin 中。

编辑:由于无法打开文件,您可以通过关键字 ENOENT 或 grep 字符串进行搜索No such file or directory

EDIT2:我再次查看了输出并检查了 futex 的手册页。因此,似乎访问内存位置 0x7f650fe159d0 的某些东西正在持有锁(可能是共享锁)并且没有释放它。pid 24250 也是一个参数。您可以检查一下这个 pid 在做什么吗?

另外,您能检查一下 pid 24249 所关联的内核函数吗?可以使用ps -eo wchan <pid>命令中的 wchan 选项来显示。我不记得完整的详细 wchan 列表,但我明天会把它给你。(这里已经很晚了)。

相关内容