2011-03-04 36 views
4

我有一个运行在Ubuntu 10.04上的GTK程序挂起在可中断状态,我想了解strace的输出。特别是,我有这样一行:识别导致从strace挂起的文件

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

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

回答

8

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

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

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

不错,非常感谢! – Greg

+0

这指向'/ etc/passwd' ...我能确定它是否正确,即有没有可能通过另一个函数修改文件描述符而不是'open'?谢谢 – Greg

+2

如果它是第一个'打开',并​​且这个文件描述符位于错误的'read'之上,那么是的,那个文件就是那个。文件描述符只有在调用close时才能被重用。如果你想确定,使用'-eopen,read,close'。文件描述符与相应的'open'和'close'之间的文件唯一关联。 – liberforce

0

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

+2

是的,我想通了,有没有什么办法来识别与文件描述符5关联的文件? – Greg

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