5

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

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

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

4

3 回答 3

9

您可以通过调用找到哪个文件使用此文件描述符strace -o log -eopen,read yourprogram。然后在log文件中搜索感兴趣的调用read。从这一行开始(而不是从文件的第一行开始),向上搜索此文件描述符的第一次出现(通过调用返回open)。

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

open("/etc/ld.so.cache", O_RDONLY)      = 3
于 2011-03-07T12:47:01.387 回答
0

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

于 2011-03-04T13:54:40.280 回答
0

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

形成 strace

[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
于 2016-06-22T14:21:52.673 回答