【问题标题】:strace on Linux not logging all calls to open()Linux 上的 strace 没有记录对 open() 的所有调用
【发布时间】:2016-08-05 01:42:37
【问题描述】:

我在 Linux 上使用 strace 来捕获对 open()、close() 和 read() 的调用。目标进程是码头网络服务器。据我所知,strace 没有记录所有对 open() 的调用。也许其他人也是,我没有尝试将文件描述符与 open() 调用相关联。

比如开始strace:

strace -f -e trace=open,close,read -o/tmp/strace.out -p62881

然后我使用 wget 获取 100 个静态文件;都已成功检索。在一次运行中,只记录了 56 个打开的事件;在另一次运行 100 个不同的文件时,我得到了 66 个打开的事件。

我相信使用“-f”会导致 strace 附加到线程的所有 LWPID(“进程 62881 附加了 25 个线程 - 中断退出 "); 当我尝试使用多个“-p”选项显式附加到所有人时,我得到一个“附加”成功消息,但有多个“操作不允许消息”,每个子 PID 一个。

我在测试前重新启动了 Jetty 以清除其缓存。

内核版本为 2.6.32-504.3.3.el6.x86_64 (Red Hat)。 strace 包版本为 strace-4.5.19-1.19.el6.x86_64。

我错过了什么?

谢谢

【问题讨论】:

    标签: linux multithreading strace


    【解决方案1】:

    在某些系统上,您必须使用 openat() 而不是 open()。

    尝试: strace -f -e trace=openat,close,read -o/tmp/strace.out -p62881

    【讨论】:

    • 在 Ubuntu 20.04 x86-64 上这对我来说是正确的。
    【解决方案2】:

    试试-ff(除了-f):

    -ff: If the -o filename option is in effect, each processes trace is written to filename.pid  where  pid  is
         the  numeric process id of each process.  This is incompatible with -c, since no per-process counts are
         kept.
    

    【讨论】:

    • 一个好建议。不幸的是,它没有捕获所有 open() 事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2020-11-23
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多