【问题标题】:Identifying file causing hang from strace识别导致 strace 挂起的文件
【发布时间】:2011-07-08 20:27:07
【问题描述】:

我有一个在 Ubuntu 10.04 上运行的 GTK 程序,它以可中断状态挂起,我想了解 strace 的输出。特别是,我有这行:

read(5, 0x2ba9ac4, 4096) = -1 EAGAIN (Resource temporarily unavailable)

我怀疑5 是文件描述符,0x2ba9ac4 是要读取的文件中的地址,4096 是要读取的数据量。你可否确认?更重要的是,如何确定程序试图读取哪个文件? /proc/pid/fd 中不存在此文件描述符(这可能是程序挂起的原因)。

【问题讨论】:

    标签: memory gtk ubuntu-10.04 strace


    【解决方案1】:

    read() 的第二个参数只是目标指针,它要求从文件描述符 5 中读取,最大 4096 字节。 read()the manual page

    【讨论】:

    • 是的,我想通了,有没有办法识别与文件描述符5关联的文件?
    【解决方案2】:

    您可以通过调用strace -o log -eopen,read yourprogram 来查找使用该文件描述符的文件。然后在log 文件中搜索对感兴趣的read 的调用。从这一行开始(而不是从文件的第一行开始),向上搜索该文件描述符的第一个匹配项(通过调用 open 返回)。

    比如这里open返回的文件描述符是3:

    open("/etc/ld.so.cache", O_RDONLY)      = 3
    

    【讨论】:

    • this 指向 /etc/passwd... 我可以确定它是正确的,即文件描述符是否有可能被 open 之外的另一个函数修改?谢谢
    • 如果它是第一个带有此文件描述符的 open 在故障 read 之上,那么是的,该文件就是那个文件。仅当已调用 close 时,才能重用文件描述符。如果您想确定,请使用-eopen,read,close。文件描述符与对应的 openclose 之间的文件唯一关联。
    【解决方案3】:

    添加到@liberforce 答案,如果进程已经在运行,您可以使用 lsof 获取文件名

    表单跟踪

    [pid  7529] read(102, 0x7fedc64c2fd0, 16) = -1 EAGAIN (Resource temporarily unavailable)
    

    现在,用 lsof

    lsof -p 7529 | grep 102
    java    7529 luis  102u  0000                0,9        0     9178 anon_inode
    

    【讨论】:

      猜你喜欢
      • 2013-12-14
      • 2013-01-20
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多